其他
Kubernetes+Helm+Jenkins 自动化发布项目
目标
设置 Kubernetes 并了解其基本概念; 使用 Helm 安装 Traefik,Dashboard 和 Jenkins; 创建 Kotlin 应用程序以展示如何使用 CI/CD; 实施 Jenkins 管道以自动构建和部署应用程序。
Kubernetes:用于容器管理和编排; Traefik:作为访问服务的代理和负载平衡器; Kubernetes 仪表板:通过基于Web的界面管理Kubernetes; Jenkins:作为自动化服务器来自动构建和部署应用程序; GitHub:使用Git管理源代码; DockerHub:作为用于使用示例应用程序管理Docker映像的注册表; 应用程序说明:出于开发和测试目的的示例应用程序部署; 应用程序生产:将在生产中使用的示例应用程序部署。
Docker:用于服务和应用程序容器化; Helm:用于在Kubernetes上简化服务的部署和配置; Kotlin:开发示例应用程序,它将自动构建并部署到Kubernetes
构建和部署应用程序:签出最新的源代码版本以构建应用程序并将其部署在Kubernetes集群上; 访问应用程序:使用代理对特定主机名上的已部署应用程序进行标准化访问。
Kubernetes
术语
命名空间:一个虚拟集群,可以位于同一物理集群硬件之上,从而使各个开发团队之间的关注点分离; Pod:是最小的可部署单元,具有一组共享相同资源(例如内存,CPU和IP)的容器; 副本集:确保在任何给定时间正在运行指定数量的Pod副本; 部署:一组多个相同的Pod,定义如何运行应用程序的多个副本,如何自动替换任何失败或无响应的实例以及如何执行更新; 服务:逻辑Pod集的抽象,这是其他应用程序用来与之交互的唯一接口; 入口:管理如何提供对服务的外部访问; 持久卷:用于在Pod生命周期内持久保存数据的一块存储。
架构
Master:负责维护所需的群集状态,是管理员管理各个节点的入口点。以下软件组件在主机中运行: API服务器:REST API,它公开了可以在群集上执行的所有操作,例如创建,配置和删除Pod和服务; 调度程序:负责将任务分配给各个群集节点; Controller-Manager:确保集群状态按预期运行,对整个集群中控制器触发的事件做出反应; etcd:分布式键值存储,用于共享有关集群状态的信息,所有集群节点均可访问; 节点:执行给定任务并运行以下组件的物理或虚拟机: Docker:负责启动和管理容器的容器运行时; Kubelet:跟踪Pod的状态,以确保所有容器都按预期运行; Kube-proxy:路由从服务进入节点的流量; UI:用于管理集群配置和应用程序的用户界面应用程序。Kubernetes仪表板将在本文中使用; CLI:命令行界面,用于管理集群配置和应用程序。Kubectl将在本文中使用;
安装
Kubectl
~ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:16:51Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:07:57Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
plugins=(git kubectl)
Helm
brew install helm
helm version
~ helm version
version.BuildInfo{Version:"v3.1.1", GitCommit:"afe70585407b420d0097d07b21c47dc511525ac8", GitTreeState:"clean", GoVersion:"go1.13.8"}
Traefik
使用管理员作为用户名和密码,通过域“ traefik.localhost”访问Traefik仪表板; 对所有代理服务强制实施SSL,并自动为“ * .localhost”域生成通配符SSL证书。
helm install stable/traefik --name traefik --values traefik-values.yml
Helm del --purge traefik
kubectl get deploymentskubectl get pods
Kubernetes仪表板
helm install stable/kubernetes-dashboard --name dashboard --values dashboard-values.yml
kubectl get secrets
:kubectl describe secrets dashboard-kubernetes-dashboard-token-sk68z
:Jenkins
helm install stable/jenkins --name jenkins --values jenkins-values.yml
当所需的 Pod 运行时,请访问 http://jenkins.localhost 以访问 Jenkins 并使用先前提供的凭据登录:
应用
此外,请记住添加执行器依赖项以在 /actuator/health 上启用运行状况端点,该端点将用于向 Kubernetes 提供应用程序运行状况信息:
Dockerfile
Helm chart
Chart.yaml:图表属性,例如名称,描述和版本; values.yaml:提供给图表的默认配置值; template / deplyment.yaml:Kubernetes部署规范的模板,用于配置应用程序pod和复制特性; template / service.yaml:Kubernetes服务规范的模板,用于配置其他应用程序的应用程序接口; templates / ingress.yaml:Kubernetes入口规范的模板,以公开服务以供外部访问。
{{}}
用于模板,这意味着将解释内部的内容以提供输出值。官方指南中有关多个模板选项的更多详细信息。对于我们正在创建的模板,以下是最重要的示例:
{{.Values.replicaCount}}
从提供的值文件中获取配置副本计数;{{-toYaml. | nindent 8}}
:将引用的Yaml树(点指向当前结构引用)复制到带有8个空格的缩进的结果中。
helm install example ./helm
kubectl get deployment
kubectl get pod
kubectl get service
kubectl get ingress
Pipeline
〜/ .m2
文件夹创建一个卷,以便在作业运行之间共享下载的依赖项。构建:使用maven构建应用程序包; Docker Build:使用先前创建的Dockerfile构建docker镜像; Docker Publish:将构建的Docker映像发布到Docker Hub; Kubernetes部署:通过安装或升级相应的Kubernetes组件,使用先前创建的头盔图来部署应用程序。
Job
验证
~ curl -k -w '\n' --request GET 'https://example.localhost/greeting'{"id":1,"content":"Hello, World","env":"default_value"}
~ curl -k -w '\n' --request GET 'https://example-staging.localhost/greeting'{"id":1,"content":"Hello, World","env":"default_value"}
提交并等待Jenkins作业完成,以更新登台部署;
检查分段部署上的默认值是否已更改:
~ curl -k -w '\n' --request GET 'https://example-staging.localhost/greeting'{"id":1,"content":"Hello, World!","env":"default_value"}
将开发分支合并为主分支; 等待Jenkins主工作完成并更新生产部署; 检查生产部署是否正确更新: ~ curl -k -w '\n' --request GET 'https://example.localhost/greeting'{"id":1,"content":"Hello, World!","env":"default_value"}
- END -
公众号后台回复「加群」加入一线高级工程师技术交流群,一起交流进步。
5个面试的关键技巧,助你拿到想要的offer!
点亮,服务器三年不宕机