腾讯云容器服务TKE容器化部署网站应用全攻略:从零搭建到生产级运维
一、引言:为什么选择腾讯云TKE容器化部署网站应用
在云原生技术席卷全球的今天,容器化部署已经成为现代应用交付的事实标准。腾讯云容器服务TKE(Tencent Kubernetes Engine)作为基于原生Kubernetes的高性能容器管理服务,为开发者提供了一套高度可扩展、与腾讯云IaaS产品紧密结合的容器化管理方案。无论是初创团队还是大型企业,TKE都能帮助快速实现业务的容器化转型,消除集群运维的复杂度。
相比于传统的虚拟机部署方式,容器化部署具备启动速度快、资源利用率高、环境一致性佳、弹性伸缩灵活等显著优势。通过TKE,开发者可以将网站应用及其全部依赖打包成容器镜像,在任何环境中保持一致的运行表现,同时借助Kubernetes强大的编排能力实现自动化部署、滚动更新和自愈恢复。本文将从零开始,手把手带你完成一个网站应用在腾讯云TKE上的全流程容器化部署。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
二、准备工作:账号、权限与工具链
2.1 腾讯云账号注册与实名认证
在使用腾讯云容器服务之前,首先需要完成腾讯云账号的注册和实名认证。登录腾讯云官网,按照指引完成个人或企业实名认证后,即可获得使用TKE及相关云服务的资格。
2.2 服务授权与子账号管理
TKE服务需要获得相关资源的操作权限才能正常工作。首次进入容器服务控制台时,系统会引导完成服务授权。对于企业级生产环境,建议使用子账号进行日常操作,并通过访问管理(CAM)进行最小权限授权,避免主账号密钥泄露带来的安全风险。子账号需要被授予TKE集群的操作权限以及TCR镜像仓库的访问权限。
2.3 本地工具链安装
在本地开发环境中,需要提前安装以下工具:Docker(用于构建容器镜像)、kubectl(用于与Kubernetes集群交互)、以及腾讯云命令行工具TCCLI(可选,用于自动化操作)。Docker的安装可以参考官方文档,kubectl可以通过包管理器或直接下载二进制文件安装。
三、构建容器镜像:以Nginx静态网站为例
容器镜像是整个部署流程的起点。无论你的网站应用是静态HTML、Node.js后端、Java Spring Boot还是Python Django应用,都需要先将其打包成符合OCI标准的容器镜像。
3.1 准备网站静态文件
假设我们有一个简单的静态网站,包含index.html、style.css和app.js等文件,存放在本地的./static-files目录中。
3.2 编写Dockerfile
在项目根目录创建Dockerfile文件,内容如下:
# 使用官方Nginx镜像作为基础镜像
FROM nginx:alpine
# 将静态文件复制到Nginx默认的静态文件目录
COPY ./static-files /usr/share/nginx/html
# 可选:复制自定义Nginx配置文件
# COPY nginx.conf /etc/nginx/nginx.conf
# 暴露容器端口80
EXPOSE 80
# 启动Nginx服务(基础镜像已包含默认CMD)
对于前后端分离的应用,前端构建产物(如React的build目录、Vue的dist目录)同样可以打包到Nginx镜像中。如果是后端应用,则需要选择对应的基础镜像(如python:3.9-slim、openjdk:11-jre-slim等),并将代码和依赖复制到镜像中。
3.3 构建镜像
在Dockerfile所在目录执行以下命令构建镜像:
docker build -t my-website:v1.0.0 .
构建完成后,可以通过docker images命令查看本地镜像列表。
3.4 本地测试运行
在推送至远程仓库之前,建议先在本地运行容器进行验证:
docker run -d -p 8080:80 my-website:v1.0.0
打开浏览器访问http://localhost:8080,确认网站能够正常访问。
四、镜像仓库:腾讯云TCR的配置与使用
容器镜像构建完成后,需要将其推送至镜像仓库,以便TKE集群能够拉取并部署。腾讯云容器镜像服务TCR(Tencent Container Registry)提供安全高效的容器镜像托管和分发服务。
4.1 创建TCR企业版实例
登录腾讯云容器镜像服务控制台,创建一个TCR企业版实例。选择合适的地域和实例规格,企业版支持容器镜像安全扫描、跨地域自动同步、Helm Chart托管、网络访问控制等高级特性。
4.2 创建命名空间与镜像仓库
新建的TCR企业版实例内没有默认命名空间,需要手动创建。建议使用项目名称或团队名称作为命名空间,例如my-project。在命名空间下创建镜像仓库,仓库名称即为镜像名称,例如my-website。
需要注意的是,通过docker cli推送镜像时,若镜像仓库不存在,系统会自动创建,因此也可以跳过手动创建仓库的步骤。
4.3 配置网络访问策略
TCR企业版实例默认拒绝全部来源的外部访问。需要根据实际情况配置网络访问策略:
- 如果使用公网推送镜像,需要开启公网访问入口并配置允许访问的IP白名单
- 如果使用内网推送镜像(推荐),需要将本地开发机所在VPC或CVM实例的VPC关联到TCR实例的内网访问策略中
4.4 登录TCR并推送镜像
首先获取TCR实例的登录指令:
# 获取登录密码(通过控制台或API获取临时登录密码)
# 执行docker login
docker login demo-tcr.tencentcloudcr.com --username 您的账号 --password 临时密码
登录成功后,对本地镜像打上TCR仓库的标签并推送:
# 给镜像打标签
docker tag my-website:v1.0.0 demo-tcr.tencentcloudcr.com/my-project/my-website:v1.0.0
# 推送镜像
docker push demo-tcr.tencentcloudcr.com/my-project/my-website:v1.0.0
推送成功后,可在TCR控制台的镜像仓库页面查看已推送的镜像。
五、创建TKE集群:基础设施的搭建
TKE集群是运行容器化应用的基础环境。腾讯云TKE提供标准集群和Serverless集群两种主要类型。对于大多数网站应用场景,标准集群是更常见的选择。
5.1 创建标准集群
登录容器服务控制台,在集群列表页面选择目标地域,单击新建。按照指引完成以下配置:
- 集群信息:填写集群名称,选择Kubernetes版本(建议选择最新稳定版本,如1.28及以上)
- 集群网络:选择已有的VPC和子网,或创建新的VPC
- 容器网络:配置容器网络CIDR,需与VPC网段不冲突
- 节点配置:选择节点规格(如2核4GB)、节点数量(建议至少2个节点以实现高可用)、操作系统镜像等
- 组件配置:可选择安装日志采集、监控、Ingress Controller等组件
集群创建过程大约需要5-10分钟,创建完成后即可在集群列表中看到新集群的状态变为“运行中”。
5.2 配置kubectl访问集群
在集群详情页面,点击“集群凭证”获取访问凭证。将凭证内容保存到本地~/.kube/config文件中,或通过控制台提供的“一键连接”功能快速配置。配置完成后,执行以下命令验证连接:
kubectl cluster-info
kubectl get nodes
如果能看到集群信息和节点列表,说明kubectl已成功连接到TKE集群。
六、部署应用:Deployment与Service的配置
在Kubernetes中,Deployment负责管理Pod的生命周期(包括副本数、滚动更新、回滚等),Service则负责为Pod提供稳定的网络访问入口。
6.1 创建Deployment
编写Deployment的YAML配置文件deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-website
namespace: default
labels:
app: my-website
spec:
replicas: 2
selector:
matchLabels:
app: my-website
template:
metadata:
labels:
app: my-website
spec:
containers:
- name: my-website
image: demo-tcr.tencentcloudcr.com/my-project/my-website:v1.0.0
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
imagePullSecrets:
- name: tcr-secret
关键配置说明:
- replicas:设置Pod副本数为2,实现高可用
- image:使用TCR镜像仓库中的镜像地址
- resources:设置资源请求和限制,便于调度和资源管理
- livenessProbe/readinessProbe:配置存活探针和就绪探针,确保服务的健康运行
- imagePullSecrets:配置拉取私有镜像所需的凭证
对于使用TCR私有镜像的情况,需要先创建拉取凭证的Secret。可以通过控制台或命令行创建:
kubectl create secret docker-registry tcr-secret \
--docker-server=demo-tcr.tencentcloudcr.com \
--docker-username=您的账号 \
--docker-password=您的密码
6.2 通过控制台创建Deployment
除了使用YAML文件,也可以通过TKE控制台创建工作负载。在集群详情页中,选择“工作负载 > Deployment”,点击“新建”。填写工作负载名称、选择命名空间、配置容器镜像(从TCR中选择)、设置实例数量、配置端口映射等。控制台方式适合不熟悉YAML语法的初学者,而YAML方式更适合需要版本管理和自动化部署的场景。
6.3 创建Service暴露服务
Deployment创建完成后,Pod运行在集群内部,外部无法直接访问。需要通过Service将服务暴露出来。编写Service的YAML配置文件service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-website-service
namespace: default
spec:
type: ClusterIP
selector:
app: my-website
ports:
- protocol: TCP
port: 80
targetPort: 80
这里使用ClusterIP类型,服务仅在集群内部可访问。如果希望直接对外暴露服务,可以将type修改为LoadBalancer,TKE会自动创建公网负载均衡器CLB。
七、路由与访问:Ingress的配置与管理
Ingress是允许外部访问集群内Service的规则集合。通过Ingress,可以实现基于域名的路由、HTTPS配置、负载均衡等高级功能。
7.1 Ingress的基本概念
TKE集群默认启用了基于腾讯云负载均衡器CLB实现的Ingress Controller。Ingress将外部请求根据域名和路径转发到不同的Service,相当于一个七层负载均衡器。公网负载均衡已于2023年升级为域名化架构,VIP随业务请求动态变化,控制台不再展示VIP地址。
7.2 创建Ingress
编写Ingress的YAML配置文件ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-website-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: qcloud
# 如需使用TkeServiceConfig进行高级CLB配置
# ingress.cloud.tencent.com/tke-service-config: my-ingress-config
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-website-service
port:
number: 80
关键配置说明:
- host:配置域名,需要将域名解析到CLB的域名或IP地址
- path:配置转发路径,支持Prefix和Exact两种匹配类型
- backend:指定后端Service和端口
在TKE控制台中,也可以通过“服务与路由 > Ingress”页面进行可视化创建。
7.3 HTTPS证书配置
为网站配置HTTPS是生产环境的必要步骤。在Ingress中通过Secret配置TLS证书:
# 首先创建包含证书的Secret
kubectl create secret tls my-website-tls \
--cert=path/to/tls.crt \
--key=path/to/tls.key
# 在Ingress中引用该Secret
spec:
tls:
- hosts:
- www.example.com
secretName: my-website-tls
rules:
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-website-service
port:
number: 80
证书可以通过腾讯云SSL证书服务申请,也可以使用Let's Encrypt等免费证书。
7.4 TkeServiceConfig高级配置
对于更复杂的负载均衡配置需求,TKE提供了TkeServiceConfig自定义资源。通过该CRD可以配置CLB的健康检查、后端协议、负载均衡方式等参数。使用方式是在Ingress中添加注解ingress.cloud.tencent.com/tke-service-config指定配置名称。TkeServiceConfig资源需要与Ingress处于同一命名空间。
八、弹性伸缩:HPA自动扩缩容配置
网站应用常常面临流量波动的挑战。TKE支持通过HorizontalPodAutoscaler(HPA)实现Pod的自动水平扩缩容。当业务进入高峰期时自动扩容Pod数量以支撑服务,低谷时自动缩容释放资源。
8.1 基于CPU使用率的HPA配置
编写HPA的YAML配置文件hpa.yaml:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-website-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-website
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
该配置表示当Pod的平均CPU使用率超过60%时,自动增加Pod副本数(最多10个);当使用率低于60%时,自动减少副本数(最少2个)。
8.2 基于自定义指标的HPA
TKE还支持基于自定义指标的弹性伸缩,覆盖CPU、内存、磁盘、网络、GPU等多种指标类型。例如,可以基于网络出口带宽进行扩缩容。通过TKE控制台也可以方便地创建和管理HPA。
8.3 节点自动扩缩容
当集群节点资源不足时,Pod可能无法调度。TKE配合节点池的弹性伸缩功能,可以在节点资源不够时自动购买机器并加入集群。这对于流量突高的场景尤为重要,可以避免因节点资源不足导致的扩容失败。
九、可观测性:日志采集与监控告警
生产环境的网站应用离不开完善的日志和监控体系。TKE提供了与腾讯云日志服务CLS和云监控深度集成的可观测性方案。
9.1 日志采集配置
TKE的日志采集功能通过DaemonSet方式在集群内运行日志采集Agent。采集容器内文件日志时,无需挂载volume即可采集。
配置步骤:
- 登录容器服务控制台,进入集群详情页
- 选择左侧导航中的“日志”,进入日志采集配置页面
- 开启日志采集功能,配置采集规则(指定工作负载采集或按Pod标签采集)
- 选择或创建CLS日志主题用于存储日志
- 配置日志解析方式(如JSON解析、正则解析等)
对于托管集群,还可以采集控制面组件日志(如kube-apiserver、kube-controller-manager等)。
9.2 监控与告警配置
TKE集成了腾讯云监控服务,可以监控集群、节点、Pod的CPU、内存、网络等指标。通过云监控控制台可以配置告警策略:
- 设置CPU使用率超过阈值时告警
- 设置内存使用率超过阈值时告警
- 设置Pod重启次数异常时告警
- 设置集群节点状态异常时告警
告警可以通过短信、邮件、微信等多种方式通知运维人员。
十、生产环境最佳实践与成本优化
10.1 高可用部署策略
- 多副本部署:至少2个Pod副本,避免单点故障
- 多节点部署:至少2个Worker节点,Pod分散调度到不同节点
- Pod反亲和性:通过podAntiAffinity配置,确保同一应用的Pod不部署在同一节点
- 滚动更新策略:配置maxSurge和maxUnavailable,实现零停机更新
10.2 资源配额与成本控制
- 设置资源请求和限制:为每个容器设置合理的requests和limits,避免资源浪费和资源争抢
- 使用HPA自动伸缩:根据实际负载自动调整Pod数量
- 选择合适的节点规格:根据应用的实际资源需求选择节点规格,避免过度配置
- 利用TKE超级节点:超级节点无集群管理费用,仅需为实际运行的Pod资源付费
- 使用TKE Serverless集群:适合临时计算任务和突发流量场景
10.3 安全加固建议
- 使用私有镜像仓库:通过TCR企业版存放私有镜像,配置网络访问控制
- 配置镜像拉取凭证:使用imagePullSecrets安全拉取私有镜像
- 启用容器安全扫描:TCR企业版支持镜像安全扫描,提前发现漏洞
- 最小权限原则:使用子账号和RBAC进行权限管控
- 配置网络安全组:放通必要的端口(如80、443),限制不必要的访问
10.4 持续部署与CI/CD集成
将容器化部署流程与CI/CD流水线集成,可以实现代码提交后自动构建镜像、推送TCR、更新TKE部署的全自动化流程。常见的集成方式包括:
- 使用GitHub Actions或GitLab CI构建镜像并推送至TCR
- 使用kubectl apply或helm upgrade更新TKE部署
- 使用TKE的Helm应用市场进行应用管理
十一、常见故障排查
11.1 镜像拉取失败
- 检查imagePullSecrets是否正确配置
- 检查TCR网络访问策略是否允许集群VPC访问
- 检查镜像地址和标签是否正确
11.2 Pod无法启动
- 使用kubectl describe pod查看事件信息
- 使用kubectl logs查看容器日志
- 检查存活探针和就绪探针的配置是否正确
11.3 Service无法访问
- 检查Service的selector是否与Pod的labels匹配
- 检查集群安全组是否放通了相关端口
- 对于LoadBalancer类型,检查CLB是否正常创建
11.4 Ingress不生效
- 检查Ingress中引用的Service名称和端口是否正确
- 检查域名解析是否指向了CLB的域名或IP
- 检查Ingress Controller是否正常运行
- 注意CLB的转发规则配额限制为50个
十二、总结
本文从零开始,系统性地介绍了在腾讯云容器服务TKE上容器化部署网站应用的完整流程。从Docker镜像的构建、TCR镜像仓库的配置、TKE集群的创建,到Deployment和Service的部署、Ingress路由的配置、HPA自动扩缩容的设置,再到日志监控的采集和告警配置,涵盖了网站应用从开发到上线的全生命周期。
腾讯云TKE基于原生Kubernetes,完全兼容Kubernetes API和生态工具,同时与腾讯云的云硬盘、负载均衡、私有网络等产品深度集成。无论是简单的静态网站还是复杂的微服务架构,TKE都能提供高效、稳定、弹性的容器化运行环境。
容器化部署不仅仅是一种技术选择,更是一种思维方式的转变。通过将应用及其依赖打包成不可变的镜像,通过声明式的YAML描述期望状态,通过Kubernetes的控制器模式实现自动化的运维管理——这正是云原生时代的核心方法论。希望本文能够帮助读者建立起对腾讯云TKE容器化部署的全面认识,并能够在实际项目中灵活运用。
常见问题解答
问1:TKE标准集群和Serverless集群有什么区别?如何选择?
答:TKE标准集群是基于原生Kubernetes的集群,用户需要购买和管理Worker节点,适合长期运行的生产业务。TKE Serverless集群无需购买节点即可部署工作负载,按Pod实际运行时长计费,适合临时计算任务和突发流量场景。对于大多数网站应用,建议使用标准集群以获得更强的可控性和灵活性。
问2:使用TCR私有镜像部署时,imagePullSecrets如何配置?
答:首先通过kubectl create secret docker-registry命令创建包含TCR登录凭证的Secret。然后在Deployment的spec.template.spec.imagePullSecrets中引用该Secret名称。Secret必须创建在Pod所在命名空间中。如果TKE集群与TCR实例在同一地域,建议使用内网免密拉取方式。
问3:网站应用如何实现零停机更新?
答:Kubernetes的Deployment默认采用滚动更新策略。在更新镜像版本时,新Pod会逐步启动,就绪探针通过后才会切换流量,旧Pod在指定时间后终止。可以通过配置spec.strategy.rollingUpdate的maxSurge和maxUnavailable参数控制更新速度。建议为容器配置readinessProbe就绪探针确保新版本完全就绪后再接收流量。
问4:TKE集群中的Service和Ingress有什么区别?
答:Service是Kubernetes中定义Pod访问策略的基础资源,提供稳定的虚拟IP和负载均衡能力。Ingress则是七层路由规则集合,基于域名和路径将外部请求转发到不同的Service。简单来说,Service负责集群内部的服务发现和负载均衡,Ingress负责集群外部流量的路由和分发。对于网站应用,通常使用Ingress实现基于域名的访问和HTTPS配置。
问5:TKE的日志采集需要挂载Volume吗?
答:TKE的日志采集无需挂载Volume即可采集容器内的文件日志。日志采集Agent以DaemonSet形式运行在集群中,直接从容器文件系统采集日志。但如果日志输出到标准输出(stdout/stdin),则可以通过kubectl logs直接查看,无需额外配置日志采集规则。
问6:如何降低TKE的运行成本?
答:可以从以下几个方面优化成本:设置合理的资源请求和限制避免资源浪费;配置HPA根据负载自动调整Pod数量;利用TKE超级节点按需付费;对于测试环境可以使用TKE Serverless集群;合理规划节点规格和数量,避免过度配置;结合腾讯云的预留实例或包年包月计费模式进一步降低成本。




