K8s集群部署与应用运维实战

一、集群环境初始化

1.1 节点基础环境配置

克隆4台CentOS7虚拟机,配置2核CPU、2G内存,使用MobaXterm远程连接所有节点。其中我的docker1是master子机,docker2,docker3,docker4是worker节点子机。


关闭SELinux(关闭强制访问控制,避免权限拦截影响集群组件通信)

bash 复制代码
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
getenforce

安装时间同步服务(保证集群节点时间一致,避免因时间偏差导致证书、令牌验证失败)

bash 复制代码
yum install -y chrony

配置阿里云NTP时间服务器(统一时间源,确保集群内节点时间精准同步)

bash 复制代码
sudo bash -c 'cat > /etc/chrony.conf <<EOF
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/16
local stratum 10
EOF'

重启时间同步服务并验证(校验时间同步服务是否正常运行)

bash 复制代码
systemctl restart chronyd
chronyc sources -v

关闭Swap分区(K8s强制要求,关闭Swap可保证资源调度的稳定性,避免性能波动)

bash 复制代码
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab

1.2 内核参数优化

bash 复制代码
sudo bash -c 'cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF'

加载网桥模块并生效内核参数(开启网络转发与桥接过滤,保障Pod网络通信与Service流量转发正常)

bash 复制代码
sudo modprobe br_netfilter
sudo sysctl --system
sysctl net.bridge.bridge-nf-call-iptables net.ipv4.ip_forward

1.3 Docker 环境部署

配置Docker清华yum源(使用国内镜像源,提升Docker组件安装速度)

ini 复制代码
# /etc/yum.repos.d/docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
[centos]
name=extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/
gpgcheck=0

安装并开机自启Docker

bash 复制代码
yum install -y docker-ce
systemctl enable --now docker

配置Docker核心参数(指定私有仓库镜像加速、统一cgroup驱动与宿主机一致、信任私有仓库,解决镜像拉取与驱动不匹配问题)

bash 复制代码
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://reg.westos.org"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "insecure-registries": ["reg.westos.org"]
}
EOF

重启Docker服务

bash 复制代码
systemctl restart docker

所有节点同步Harbor证书(保证节点与私有仓库通信的证书一致性,避免证书验证失败)

bash 复制代码
scp -r /etc/docker/certs.d/ docker2:/etc/docker/

验证私有镜像拉取(测试Docker与私有仓库的连通性)

bash 复制代码
docker pull nginx

1.4 安装K8s组件

配置阿里云K8s yum源(国内镜像源,保障K8s组件安装顺畅)

ini 复制代码
# /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0

安装指定版本kubeadm/kubelet/kubectl(固定版本,避免版本差异导致集群兼容问题)

bash 复制代码
yum install -y kubelet-1.23.17-0 kubeadm-1.23.17-0 kubectl-1.23.17-0
systemctl enable --now kubelet
Harbor私有仓库部署

拷贝离线包与证书到Master节点(统一部署私有仓库,集中管理集群镜像)

bash 复制代码
scp harbor-all.tar.gz root@192.168.201.141:/root/
scp -r /etc/docker/certs.d root@192.168.201.141:/etc/docker/

解压部署Harbor

bash 复制代码
tar zxf harbor-all.tar.gz
mkdir -p /data
cp -r certs /data/ 2>/dev/null
systemctl stop firewalld
echo "192.168.201.142 reg.westos.org" >> /etc/hosts

配置Docker信任私有仓库

bash 复制代码
echo '{"insecure-registries":["reg.westos.org"]}' > /etc/docker/daemon.json
systemctl restart docker

登录Harbor(完成私有仓库身份鉴权,为后续镜像上传做准备)

bash 复制代码
docker login reg.westos.org
# 账号 admin 密码 westos

拉取K8s集群初始化镜像(提前拉取集群所需基础镜像,提升初始化速度)

bash 复制代码
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

批量打标签并上传集群镜像到Harbor(将集群镜像统一存入私有仓库,避免依赖外网镜像,保障集群部署稳定性)

bash 复制代码
docker images |grep google_containers | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/k8s/"$3"")}'
docker images  |grep k8s | awk '{system("docker push "$1":"$2"")}'

1.5 Master节点集群初始化

清理旧集群残留(彻底清除之前的集群残留配置,避免干扰新集群部署)

bash 复制代码
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
kubeadm reset -f
rm -rf /etc/cni/net.d /root/.kube
iptables -F && iptables -t nat -F

初始化集群,指定Pod网段与私有镜像仓库(定义Pod网络网段,使用私有仓库镜像,保障集群初始化安全与高效)

bash 复制代码
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s --kubernetes-version v1.23.17

1.6 配置kubectl环境变量

bash 复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

查看集群节点状态(初始节点未就绪,因未安装网络插件,后续需部署网络插件)

bash 复制代码
kubectl get node
kubectl get pod -A

1.7 kubectl 命令自动补全

bash 复制代码
yum install -y bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

提升kubectl操作效率,减少命令输入错误

二、Calico 网络插件部署

2.1 镜像上传私有仓库

官网下载calico.yaml文件,并拉取Calico镜像(获取网络插件所需镜像,为Pod网络通信提供支撑)

bash 复制代码
docker pull quay.io/calico/cni:v3.31.0
docker pull quay.io/calico/node:v3.31.0
docker pull quay.io/calico/kube-controllers:v3.31.0

批量打标签并推送至Harbor(将Calico镜像存入私有仓库,统一管理网络插件镜像)

bash 复制代码
docker images |grep calico | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/calico/"$3"")}'
docker images  |grep 'reg.westos.org/calico' | awk '{system("docker push "$1":"$2"")}'

修改yaml镜像地址为私有仓库(适配私有仓库环境,避免镜像拉取失败)

bash 复制代码
sed -i 's#quay.io/#reg.westos.org/#g' calico.yaml

2.2 部署网络插件

bash 复制代码
kubectl apply -f calico.yaml

部署Calico网络插件,为集群Pod提供网络通信与管理能力

验证Pod运行状态(检查Calico组件是否正常运行,保障网络插件生效)

bash 复制代码
kubectl get pod -A |grep calico

查看节点就绪状态(节点就绪后,Pod网络通信正常,集群网络架构搭建完成)

bash 复制代码
kubectl get node

2.3 Worker节点扩容加入集群

清理Docker残留代理配置(解决代理导致的私有仓库连接失败问题)

bash 复制代码
mkdir -p /etc/systemd/system/docker.service.d
rm -rf /etc/systemd/system/docker.service.d/http-proxy.conf
rm -rf /etc/systemd/system/docker.service.d/proxy.conf
systemctl daemon-reload
systemctl restart docker

重新登录Harbor(恢复私有仓库正常访问权限)

bash 复制代码
docker login reg.westos.org

Master生成最新加入命令(生成有效集群加入令牌,保障Worker节点安全加入)

bash 复制代码
kubeadm token create --print-join-command

Worker节点执行加入集群

bash 复制代码
kubeadm join 192.168.201.141:6443 --token ejlqfh.kjz4uakgopcv8lne --discovery-token-ca-cert-hash sha256:5da6e15855c10919f4bd3bc364fe9794a86b3e2ac5aa809229216fefd993a879

Master查看全部节点(验证所有节点成功加入集群,完成集群扩容)

bash 复制代码
kubectl get nodes

三、业务应用部署运维

3.1 业务镜像上传Harbor

加载本地镜像包(myapp.tar文件包在官网下载,导入自定义业务镜像,为应用部署提供基础)

bash 复制代码
docker load -i myapp.tar

重打私有仓库标签(规范镜像标签,适配私有仓库存储规范)

bash 复制代码
docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2

推送镜像到仓库(将业务镜像存入私有仓库,统一管理应用镜像)

bash 复制代码
docker push reg.westos.org/library/myapp:v1
docker push reg.westos.org/library/myapp:v2

3.2 创建Deployment控制器

bash 复制代码
kubectl create deployment myapp --image=reg.westos.org/library/myapp:v1 --replicas=3

创建Deployment控制器,定义应用副本数与镜像,实现Pod生命周期自动化管理

查看Pod与部署状态(验证应用Pod是否正常启动,检查部署资源状态)

bash 复制代码
kubectl get pod
kubectl get deployments.apps

删除Pod验证自愈能力(测试Deployment控制器的副本自动修复能力,保障应用高可用)

bash 复制代码
kubectl delete pod myapp-678fcbc488-jcjqg
kubectl get deployments.apps
kubectl get pod

进入Pod内部执行命令(验证Pod内应用运行状态,排查应用部署问题)

bash 复制代码
kubectl exec myapp-678fcbc488-p7crf -- ls /usr/share/nginx/html

3.3 Pod 扩容与缩容

扩容副本(动态调整应用实例数量,应对流量峰值)

bash 复制代码
kubectl scale deployment myapp --replicas=6
kubectl get pod

缩容副本(动态减少应用实例数量,节约资源成本)

bash 复制代码
kubectl scale deployment myapp --replicas=3
kubectl get pod

3.4 Service服务暴露

创建ClusterIP类型Service(仅集群内访问,保障应用服务安全访问)

bash 复制代码
kubectl expose deployment myapp --port=80 --target-port=80

查看服务详情(了解Service端口映射、后端Pod关联等信息,排查服务访问问题)

bash 复制代码
kubectl describe svc myapp

访问集群内部服务(测试Service对Pod的流量转发与负载均衡能力)

bash 复制代码
curl 10.108.255.190
curl 10.108.255.190/hostname.html

3.5 查看版本历史

bash 复制代码
kubectl rollout history deployment myapp

查看Deployment的版本迭代记录,为应用版本管理与回滚提供依据

3.6 应用版本回滚

bash 复制代码
kubectl rollout undo deployment myapp --to-revision=1
curl 10.108.255.190

回滚到指定历史版本,快速修复应用部署异常

3.7 删除应用资源

bash 复制代码
kubectl delete deployments.apps myapp
kubectl delete svc myapp
kubectl get pod

清理应用部署资源,释放集群资源

名称空间资源隔离

bash 复制代码
kubectl get ns

通过名称空间实现集群资源逻辑隔离,便于多租户或多应用环境下的资源管理与权限划分。

注意!

1.Master节点操作(其中一台主要虚拟机)

集群初始化、配置kubectl环境变量、安装Calico网络插件、生成节点加入命令、部署业务Pod、Service暴露、版本查看与回滚、集群状态查询。

2.Worker节点操作(另外三台虚拟机)

清理Docker代理配置、登录私有Harbor仓库、执行join命令加入集群。

3.所有节点共同操作

系统初始化、时间同步、关闭swap、内核优化、安装Docker与k8s组件、同步仓库证书。

相关推荐
Elastic 中国社区官方博客2 小时前
自动化可靠性:自愈型企业的架构
运维·elasticsearch·搜索引擎·云原生·架构·自动化·serverless
枕布响丸辣2 小时前
万字详解 GlusterFS 分布式文件系统:原理 + 卷类型 + CentOS 7 集群部署
linux·运维·centos
程序员大辉2 小时前
开源客户端SSH Netcatty:免费替代Termius,带AI的现代化运维工具
运维·开源·ssh
Elivs.Xiang2 小时前
ubuntu20中安装Jenkins
linux·运维·ubuntu·jenkins
说再见再也见不到2 小时前
Ubuntu 将阿里云 OSS 对象存储挂载为本地硬盘(含开机自启)
linux·运维·服务器·ubuntu·阿里云·云计算
坚持就完事了2 小时前
Linux的重定向符
运维·服务器·前端
艾莉丝努力练剑2 小时前
【Linux网络】计算机网络入门:从背景到协议,理解网络通信基础
linux·运维·服务器·c++·学习·计算机网络
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(十):线程安全和重入、死锁相关话题
java·linux·运维·服务器·c++·学习·安全
运维老郭2 小时前
Nginx vs Envoy:高并发负载均衡实战指南(含踩坑记录)
linux·运维