从零到一:在阿里云ACK托管K8s上构建并发布你的首个容器应用
1. 为什么选择阿里云ACK托管Kubernetes如果你刚开始接触容器化和云原生技术可能会被各种陌生的术语和复杂的配置搞得晕头转向。我刚开始接触Kubernetes时光是搭建一个测试环境就折腾了好几天各种组件配置让人头大。直到发现了阿里云的ACK托管服务才发现原来部署容器应用可以这么简单。ACKAlibaba Cloud Container Service for Kubernetes是阿里云提供的托管版Kubernetes服务它最大的优势就是帮你处理了集群管理的复杂性。你不用再操心控制平面的安装、升级、维护这些琐事阿里云会全权负责这些底层工作。这就像你去餐厅吃饭不用自己种菜、杀鱼、生火厨师已经把最难的部分都搞定了你只需要点菜和享用美食就行。对于个人开发者和小团队来说ACK特别友好。它提供了一键式集群创建几分钟就能获得一个生产就绪的Kubernetes环境自动伸缩根据负载动态调整资源既省成本又保证性能内置监控告警开箱即用的监控面板不用再折腾Prometheus配置无缝集成阿里云生态可以轻松使用SLB、NAS、日志服务等周边产品我去年帮一个创业团队迁移到ACK原本需要专职运维的工作现在开发人员自己就能搞定每月还节省了30%的云资源成本。对于刚入门的开发者我强烈建议从托管服务开始等熟悉了核心概念再考虑自建集群。2. 准备工作从零开始配置你的环境2.1 注册阿里云账号并开通ACK服务首先你需要一个阿里云账号访问阿里云官网注册即可。新用户通常有免费试用额度足够你完成这个实验。注册完成后在控制台搜索容器服务Kubernetes版进入ACK产品页面。这里有个小技巧建议先开通资源访问授权。在ACK控制台左侧导航栏找到授权管理点击同意授权。这一步让ACK有权限帮你创建负载均衡、VPC等资源否则后续操作会频繁提示权限不足。2.2 准备你的容器镜像假设你已经有了一段简单的Web应用代码比如用Flask或Express写的Hello World现在需要把它打包成容器镜像。如果你还没有现成应用可以用这个简单的Nginx示例# Dockerfile FROM nginx:alpine COPY index.html /usr/share/nginx/html在同目录下创建一个index.html文件!DOCTYPE html html head title我的第一个容器应用/title /head body h1恭喜你的应用在ACK上运行成功了/h1 /body /html使用以下命令构建并推送镜像到阿里云容器镜像服务ACR# 登录ACR docker login --username你的账号 registry.cn-hangzhou.aliyuncs.com # 构建镜像 docker build -t my-first-app . # 打标签 docker tag my-first-app registry.cn-hangzhou.aliyuncs.com/你的命名空间/my-first-app:v1 # 推送镜像 docker push registry.cn-hangzhou.aliyuncs.com/你的命名空间/my-first-app:v1注意替换上面的账号和命名空间信息。如果遇到权限问题需要在ACR控制台设置实例密码。3. 创建你的第一个Kubernetes集群3.1 在控制台创建托管版集群现在进入正题我们来创建一个ACK托管版集群在ACK控制台点击创建集群选择托管版不是专业版或Serverless版填写集群名称比如my-first-cluster地域选择离你最近的区域如华东1杭州网络配置保持默认VPC和vSwitch即可节点池配置选择新增节点实例规格选最便宜的ecs.t5-lc1m2.small约0.04元/小时操作系统选择AliyunLinux 2.1903设置登录密码或密钥对其他选项全部保持默认点击创建集群集群创建大约需要5-10分钟。期间你可以喝杯咖啡或者继续阅读下文的其他配置说明。创建完成后你会看到集群状态变为运行中。3.2 配置kubectl连接集群虽然ACK控制台提供了Web终端但我建议配置本地的kubectl工具这样操作起来更灵活在集群列表找到刚创建的集群点击详情在连接信息选项卡下复制公网访问的配置命令在你的本地终端执行这个命令测试连接运行kubectl get nodes应该能看到一个Ready状态的节点如果遇到证书错误可能是你的kubectl版本太旧。建议使用阿里云CLI工具aliyun来管理配置curl -L https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz | tar xz sudo cp aliyun /usr/local/bin aliyun configure # 按照提示配置AK/SK4. 部署你的第一个应用4.1 创建Deployment现在我们要把之前推送的镜像部署到集群中。在ACK控制台进入工作负载 → 无状态点击使用镜像创建填写应用名称my-first-deployment在容器组部分点击选择镜像找到你推送的镜像端口配置如果应用监听80端口添加容器端口80副本数设置为2这样即使一个实例挂了应用仍然可用点击创建或者使用kubectl通过YAML文件部署# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-first-deployment spec: replicas: 2 selector: matchLabels: app: my-first-app template: metadata: labels: app: my-first-app spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/你的命名空间/my-first-app:v1 ports: - containerPort: 80应用这个配置kubectl apply -f deployment.yaml4.2 暴露服务到公网部署完成后应用还只能在集群内部访问。我们需要创建一个Service来暴露它在ACK控制台进入服务 → 服务点击创建选择类型为负载均衡关联我们刚创建的Deployment端口映射设置为80:80点击创建或者用YAML创建Service# service.yaml apiVersion: v1 kind: Service metadata: name: my-first-service spec: selector: app: my-first-app ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer应用配置kubectl apply -f service.yaml等待约1分钟运行kubectl get svc在EXTERNAL-IP列会看到一个公网SLB地址。在浏览器访问这个地址你应该能看到之前写的HTML页面了5. 验证与日常管理5.1 检查应用状态在ACK控制台的工作负载页面你可以看到Deployment的运行状态。点击名称进入详情可以看到Pod列表及各自状态事件日志帮助排查问题资源使用情况常用的kubectl检查命令# 查看Pod状态 kubectl get pods -o wide # 查看Pod日志替换为你的Pod名称 kubectl logs my-first-deployment-xxxxx # 查看Service详情 kubectl describe svc my-first-service5.2 应用更新与回滚当你有新版本要发布时只需更新镜像标签并重新部署kubectl set image deployment/my-first-deployment nginxregistry.../my-first-app:v2如果新版本有问题可以快速回滚kubectl rollout undo deployment/my-first-deployment在控制台的应用发布页面你可以看到所有的发布历史点击即可回滚到任意版本。这种机制大大降低了发布风险我团队的生产环境就靠这个功能躲过了好几次重大故障。6. 成本优化与清理资源6.1 设置自动伸缩为了节省成本我们可以配置HPAHorizontal Pod Autoscaler让系统根据负载自动调整实例数kubectl autoscale deployment my-first-deployment --cpu-percent50 --min1 --max5这条命令会在CPU使用率超过50%时自动扩容最多扩展到5个实例最低保持1个实例。对于测试环境你还可以配置CronHPA在非工作时间自动缩容到0。6.2 清理实验资源完成实验后记得删除资源避免持续计费在ACK控制台删除Deployment和Service在集群列表删除整个集群在ACR控制台删除不需要的镜像或者用命令行一键清理kubectl delete deployment my-first-deployment kubectl delete svc my-first-service记住只要集群存在就会持续产生费用即使没有运行任何应用所以测试完成后一定要记得删除。我有次忘记删除测试集群一个月后收到了意想不到的账单...