ithuang
ithuang
发布于 2026-06-15 / 5 阅读
0

Kubernetes 容器编排之企业级集群部署

为什么需要 Kubernetes 容器编排

传统部署的核心问题

① 环境不一致:多环境差异大,上线易出错,排查成本高

② 扩展性差:手动扩容,应对突发流量慢、成本高

③ 资源利用率低:应用独占硬件,服务器闲置严重

④ 部署升级复杂:人工操作,易出错、耗时久

⑤ 运维成本高:手动管理,运维压力大,难保证高可用

**总结:**传统部署核心问题集中在环境、扩展、资源、部署、运维上,无法满足现代业务高可用、弹性、快速迭代需求。

Kubernetes 容器编排之企业级集群部署1.png

Kubernetes 编排的核心优势

① 自动化部署:自动调度容器,支持滚动升级、回滚,减少人工

② 弹性伸缩:按CPU/请求量等自动扩缩容,解决扩展难题

③ 高可用:自动检测故障,容器重启+多副本,保障服务不中断

④ 资源优化:集群统一调度,容器共享资源,提高服务器利用率

⑤ 多环境一致:容器镜像保证开发、测试、生产环境统一

小结

老式部署全是人工短板,k8s就是自动化管家,专门解决传统部署的核心痛点 ,这是咱们学习k8s的原因

Kubernetes 概述

什么是 Kubernetes*

Kubernetes**(简称 K8s)是一个开源的容器编排**平台,用于自动化部署、扩展和管理容器化应用。

它最初由 Google 开发,并由 Cloud Native Computing Foundation(CNCF)维护。

Kubernetes 为什么简称 K8s ?

K**(uber nete)**s,中文意思是 舵手。舵手不直接生产集装箱(容器),只负责指挥、调度、管理集群,是 “容器集群的掌舵者”。

Kubernetes 容器编排之企业级集群部署2.png

核心功能*

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

Kubernetes 架构图

Kubernetes 容器编排之企业级集群部署3.png

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 系统各个组件调用关系:

  1. kubernetes集群启动之后,master和node都会将自身的信息存储到etcd数据库中;
  2. 一个Nginx服务的【安装】请求,会首先被发送到master节点的apiServer组件;
  3. apiServer组件会调用scheduler组件来决定到底将服务安装到哪个node节点上;
  4. apiServer调用controller-manager去调度Node节点安装nginx服务 对比pod实际状态与期望状态是否一致
  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的 Pod

Kubernetes 容器编排之企业级集群部署4.png

至此,一个nginx服务就运行了。

如果需要外部来访问Nginx,就需要通过kube-proxy来对pod产生访问的代理。这样,外界用户就可以访问集群中的nginx服务了

Pod 是kubernetes的最小操作单元,容器必须跑在 Pod 中

Kubernetes 容器编排之企业级集群部署5.png

Kubernetes 集群安装部署 (单主集群)

单主集群,也就是控制面板为一台 MASTER 的 K8s 集群(测试环境)

硬件规划

每台机器最少 2U2G,50G(虚拟机用多少会开辟多少)。

IP地址角色用途
192.168.88.170master01控制平面
192.168.88.171worker01工作节点
192.168.88.172worker02工作节点

环境准备

主机准备

先打一个快照,然后再后续操作。

#所有节点都要设置主机名
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。
 

Kubernetes 容器编排之企业级集群部署6.png

# 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

Kubernetes 容器编排之企业级集群部署7.png

#部署 网络插件
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

Kubernetes 容器编排之企业级集群部署8.png

如果等了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

Kubernetes 容器编排之企业级集群部署9.png

通过window下载最新版并上传到服务器

https://github.com/cilium/cilium-cli/releases/tag/v0.18.8

Kubernetes 容器编排之企业级集群部署10.png

安装

#解压
[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

 
  

Kubernetes 容器编排之企业级集群部署11.png

Kubernetes 容器编排之企业级集群部署12.png

启用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(哈勃),是为了纪念他。

Kubernetes 容器编排之企业级集群部署13.png

通过浏览器访问

Kubernetes 容器编排之企业级集群部署14.png

Kubernetes 容器编排之企业级集群部署15.png

卸载

# 在主节点上,卸载
[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,全部的

Kubernetes 容器编排之企业级集群部署16.png

初始化的常见问题

1 查看节点,提示8080连接被拒绝,报错

Kubernetes 容器编排之企业级集群部署17.png

Kubernetes 容器编排之企业级集群部署18.png

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

Kubernetes 容器编排之企业级集群部署19.png

#如果初始化 init 不成功,解决方法:
kubeadm reset -f 

再初始化

3 忘记复制 token

token有时效性(大家可以查一下是24h还是多久),超期后,需要手动重新生成一个。

#如果你忘了复制,也没关系,在master节点执行以下命令,重新生成一个
kubeadm token create --print-join-command

4 找不到 Containerd 的 sock

Kubernetes 容器编排之企业级集群部署20.png

查看服务是否启动

dnf list installed | grep containerd

systemctl status containerd

systemctl enable containerd

systemctl start containerd

5 防火墙产生告警

Kubernetes 容器编排之企业级集群部署21.png

关闭防火墙

systemctl disable firewalld.service

systemctl stop firewalld.service

Kubernetes 容器编排之企业级集群部署22.png

6 swap 告警

Kubernetes 容器编排之企业级集群部署23.png

解决办法:

# 临时关闭交换区
swapoff  -a 

#永久关闭交换区,注释掉
sed -i 's/.*swap.*/#&/g' /etc/fstab

7 域名告警

Kubernetes 容器编排之企业级集群部署24.png

echo  '192.168.88.170 master01.itcast.cn master01'  >>  /etc/hosts

8 kubelet 开机自启的告警

Kubernetes 容器编排之企业级集群部署25.png

解决办法:

[root@master01 ~]# systemctl status kubelet

[root@master01 ~]# systemctl enable kubelet.service

Kubernetes 容器编排之企业级集群部署26.png

9 ipv4 转发未开启的报错

Kubernetes 容器编排之企业级集群部署27.png

解决办法:

# 加载 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等服务不健康

Kubernetes 容器编排之企业级集群部署28.png

修改沙箱镜像

#生成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,看到页面,说明集群部署成功

Kubernetes 容器编排之企业级集群部署29.png

课上思考题:

为什么访问任一集群节点的 30080 端口,都可以成功?

内在的机制是怎样的?

集群容器管理工具

集群管理工具kubectl

kubectl 是 Kubernetes 的命令行客户端工具,核心作用是与 kube-apiserver 进行通信,向 Kubernetes 集群发送各类操作命令。

类比

Linux 系统中,通过 bash 工具管理操作系统;

Kubernetes 集群中,通过 kubectl 工具管理整个集群。

基本作用

kubectl 是 Kubernetes 的 命令行客户端工具。

它的作用是与 kube-apiserver 通信,向集群发送命令。

通过它你可以 部署应用、查看资源、排查问题、管理集群。

工作原理

  1. kubectl 读取配置文件(通常是 ~/.kube/config),里面保存了 API Server 的地址、用户凭证、集群信息等。
  2. 它把用户的命令转成 RESTful API 请求,发送到 API Server。
  3. API Server 验证请求并执行操作,比如创建 Pod、查询 Service、更新 Deployment 等。
  4. 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

Kubernetes 容器编排之企业级集群部署30.png

配置告警

Kubernetes 容器编排之企业级集群部署31.png

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

Kubernetes 容器编排之企业级集群部署32.png

#在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

Kubernetes 容器编排之企业级集群部署33.png

服务访问

登录后台,通过服务器地址访问 http://ip:8080

默认用户名: admin,密码:Kuboard123

Kubernetes 容器编排之企业级集群部署34.png

Kubernetes 容器编排之企业级集群部署35.png

Kubernetes 容器编排之企业级集群部署36.png

从master主控节点上面复制集群的连接信息

[root@node1 ~]# cd /root/.kube/
[root@node1 .kube]# cat config

Kubernetes 容器编排之企业级集群部署37.png

Kubernetes 容器编排之企业级集群部署38.png

比如

Kubernetes 容器编排之企业级集群部署39.png

最后点击确定

Kubernetes 容器编排之企业级集群部署40.png

Kubernetes 容器编排之企业级集群部署41.png

Kubernetes 容器编排之企业级集群部署42.png