什么是Kubernetes部署?
-
使用一个K8s示例应用通过Buddy流水线操作构建Docker镜像并推送至Docker Hub注册中心
- 通过K8s示例应用设置两个Hello World演示部署于K8s集群之中以便测试负载均衡器
- 为K8s示例应用安装Ingress NGINX控制器于K8s集群之中
- 使用Cert-Manager添加域名SSL证书
K8s优势
以下是使用K8s的一些优势:
-
自愈能力 – 通过自动调度程序,K8s能够在出现错误或超时的情况下用新容器替换容器。
- 滚动(Rollouts与回滚(Rollbacks – 除了自我修复能力外,K8s还实现了新部署滚动,类似于蓝绿色部署,大大减少了停机机会。
- 负载分配和自动发现 – 在K8s上运行的解耦应用程序能够在本地集群网络上进行通信,从而减少公开应用程序地址所需的工作量。除此之外,K8s还有多个负载分配点。这意味着,您可以将负载从入口层和服务层分配到Pod。
- 横向与纵向扩展 – K8s允许我们根据场景进行横纵扩展。您可以运行同一应用程序的500多个容器,并且仍然几乎毫不费力地管理分配给每个容器的资源。说明K8s为您的应用程序提供弹性伸缩!
- 交付速率 – 发布应用程序的速度对当今每个团队都至关重要。过去,发布必须由许多团队成员在预定维护期间完成,期间会出现很多中断和停机时间。
K8s构架
K8s本身由几个组件组成。但我们不会在本文中介绍所有内容,主要关注于容器,我们还将使用Docker。
K8s部署工作原理
流水线可以被认为是将服务或应用程序从A点移动到B点的一种方式。在CI/CD方面,我们可以将其分为三种类型:
-
持续集成 – 通过GitHub等版本控制平台对代码进行测试和版本控制。这就是Buddy的用武之地,它提供了更简单、更高效的流水线配置方式。
- 持续交付 – 有助于将应用程序从版本控制平台部署到云服务或其他供应商特定的服务。交付流水线需要批准才能部署到特定环境,例如生产环境或面向客户的环境。
- 持续部署 – 无需人为干预、批准或输入,即可轻松自动部署到云端。
无论有没有DevOps工作人员,您的团队都不必担心与运维相关的问题,比如弄清楚三个应用程序组件的交付。最重要的是保持对产品的聚焦。
K8s自动化陷阱
技术栈
Buddy凭借着其直观的GUI和流水线声明式YAML配置解决了这些问题。
安全性
Buddy如何处理安全问题
- 只需按一下按钮即可自动加密和手动加密。
- 存储仓通用的操作变量建议和默认环境变量
模糊的平台与工具关联
Buddy提供与各大商家的各种集成,以及具有声明性流水线操作模式丰富的buddy.yml
脚本。
K8s部署如何工作? 示例流水线
GitHub Repo中下载源码!
构建与推送Docker镜像
- 如果您还没有Buddy帐号可在此免费创建一个
GitHub存储仓中的源码并推送至刚刚创建的项目存储仓:
然后在Buddy中添加DigitalOcean集成,以方便持续集成所要使用的DigitalOcean Kubernetes集群:
流水线中添加操作
在hello项目中创建一条流水线:
构建镜像,为将所构建的镜像推送至Docker Hub而做准备:
Dockerfile文件并提交完成添加Docker构建镜像操作:
推送Docker镜像
推送Docker镜像的作用是可将上一个操作构建好的镜像推送至目标Docker注册中心,也就是Docker镜像存储仓,例如:Docker Hub、Amazon ECR、Google GCR以及私有的镜像注册中心等等不一。
Docker Hub,目前只需要在Docker官方网站上免费注册一个帐户即可使用。
推送Docker镜像
运行流水线
运行”按钮开始运行流水线:
获取Docker镜像信息
自动化部署K8s集群
部署第一个Hello World
hello-kubernetes-first.yaml,同时在文件中添加以下代码:
apiVersion: v1
kind: Service
metadata:
name: hello-kubernetes-first
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: hello-kubernetes-first
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kubernetes-first
spec:
replicas: 3
selector:
matchLabels:
app: hello-kubernetes-first
template:
metadata:
labels:
app: hello-kubernetes-first
spec:
containers:
- name: hello-kubernetes
image: paulbouwer/hello-kubernetes:1.10
ports:
- containerPort: 8080
env:
- name: MESSAGE
value: 这是第一个Hello World部署!
Deployment和服务(Service
。 部署包含aulbouwer/hello-kubernetes:1.7
镜像的三个副本(replicas
和一个名为MESSAGE
的环境变量(您将在访问应用程序时看到此信息。这里的服务(Service
定义为在80
端口显露(expose
集群内的部署(Deployment
。
hello-kubernetes-first.yaml文件,这个文件将在流水线运行时提交部署至K8s集群中:
部署第二个Hello World
hello-kubernetes-second.yaml文件作为第二个Hello World演示,并在文件中添加以下代码:
apiVersion: v1
kind: Service
metadata:
name: hello-kubernetes-second
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: hello-kubernetes-second
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kubernetes-second
spec:
replicas: 3
selector:
matchLabels:
app: hello-kubernetes-second
template:
metadata:
labels:
app: hello-kubernetes-second
spec:
containers:
- name: hello-kubernetes
image: paulbouwer/hello-kubernetes:1.10
ports:
- containerPort: 8080
env:
- name: MESSAGE
value: 这是第二个Hello World部署!
此时我们就可以在流水线中看到如下图所示的流水线信息:
kubectl get service
运行以上代码后会显示以下信息
hello-kubernetes-first和hello-kubernetes-second都已列出,说明已经创建成功Kubernetes。
安装Nginx Ingress
我们将使用Helm安装Nginx Ingress 控制器
/ingresses端点以获取可用Ingress资源的更新。该服务的类型为LoadBalancer
。因为您将其部署到DigitalOcean Kubernetes集群,集群将自动创建一个DigitalOcean负载均衡器,所有外部流量将通过该负载均衡器流向控制器。然后控制器会将流量路由到适当的服务,如Ingress资源中定义的那样。
LoadBalancer服务知道自动创建的负载均衡IP地址。某些应用程序(例如:ExternalDNS需要知道其IP地址,但只能读取Ingress的配置。通过在helm install
安装期间将controller.publishService.enabled
参数设置为true
,可以将控制器配置为在每个Ingress上发布IP地址。建议启用此设置以支持可能依赖于负载均衡器IP地址的应用程序。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
更新系统,让Helm知道所包含的内容:
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true
此命令从稳定chart存储仓安装Nginx Ingress,将Helm版本命名为nginx-ingress
,并将publishService
参数设置为true
。
运行此命令以查看负载均衡器是否可用:
kubectl --namespace default get services -o wide -w nginx-ingress-ingress-nginx-controller
该命令在默认命名空间中获取Nginx Ingress服务并输出其信息,但该命令不会立即退出。使用-w
参数,它会在发生更改时监测并刷新输出信息。
hello-kubernetes应用程序部署。
使用Ingress显露公开应用程序
-
1.m2jd.com
- 2.m2jd.com
首先,通过以上已在Buddy创建的hello项目存储仓中再创建一个名为hello-kubernetes-ingress.yaml的文件,并添加以下代码部署两个示例域名以便在浏览器中测试:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-kubernetes-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: "1.m2jd.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-kubernetes-first
port:
number: 80
- host: "2.m2jd.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-kubernetes-second
port:
number: 80
hello-kubernetes-ingress定义Ingress资源。然后指定两个主机规则,以便将1.m2jd.com域名转向路由到hello-kubernetes-first服务,并将2.m2jd.com域名转向路由到第二个部署hello-kubernetes-second的服务。
提交Kubernetes部署之中并运行流水线。我们就可看到如下图的hello-kubernetes-ingress部署到K8s集群的Buddy流水线运行记录:
用Cert-Manager加强Ingress安全
ClusterIssuer,并修改Ingress的配置以使用TLS证书。安装和配置后,应用程序将在HTTPS之下运行。
ClusterIssuers是Kubernetes中的Cert-Manager资源,它为整个集群提供TLS证书。ClusterIssuer
是一种特定类型的发行者。
kubectl create namespace cert-manager
这时,您需要将Jetstack Helm存储仓添加到托管Cert-Manager图谱(chart的Helm。 为此,运行以下命令:
helm repo add jetstack https://charts.jetstack.io
Helm将显示以下输出信息:
helm repo update
更新命令运行将显示以下输出信息:
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.10.1 --set installCRDs=true
在此命令中,我们也将installCRDs
参数设置为true
,以便在Helm安装期间安装cert-managerCustomResourceDefinition
配置清单。在写本文时,v1.10.1是最新版本。您可以参考ArtifactHub查找最新版本号。
Helm CLI操作并运行流水线:
production_issuer.yaml的文件中。在hello项目存储仓中创建并打开此文件并添加以下代码:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# Email address used for ACME registration
email: 请在此输入您的电子邮件地址
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Name of a secret used to store the ACME account private key
name: letsencrypt-prod-private-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx
接下来,同样在流水线中添加production_issuer.yaml文件到流水线操作提交Kubernetes部署之中并运行流水线:
高亮背景颜色的代码:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-kubernetes-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- 1.m2jd.com
- 2.m2jd.com
secretName: hello-kubernetes-tls
rules:
- host: "1.m2jd.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-kubernetes-first
port:
number: 80
- host: "2.m2jd.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-kubernetes-second
port:
number: 80
提交文件后Buddy将自动为您运行流水线,此时您的域名已支持SSL证书,恭喜!
K8s部署优化
Kubernetes是一个基于容器的平台,用于部署、扩展和运行应用程序。Buddy让您可以通过一系列专用的K8s操作来自动化您的Kubernetes交付工作流。
kubectl apply 或 kubectl set image
。
-
编辑代码或配置.yaml
- 将其推送至您的Git存储仓
- 构建新的Docker镜像
- 推送至Docker镜像
- 登录至您的K8s集群
- 运行
kubectl apply
或kubectl set image
如果您经常使用 kubectl apply
或 kubectl set image
,这个就是更好的解决方案!
如何自动运行K8s pod或任务
-
新版本部署时数据库迁移
- 备份
- 批量处理作业,例如:为新版本的应用程序创建目录结构。
您可以使用pods或任务,第一种类型使用任务启动单个pod;第二个启动系列pod,直到指定数量的pod以成功状态结束。
用于运行K8s pods或任务的流水线配置
-
您的应用程序源码
- 一个Dockerfile文件,其中包含有关创建应用程序镜像的说明。
- 数据库迁移脚本
- 一个Dockerfile文件,其中包含有关创建将在部署期间运行迁移的镜像说明(数据库迁移运行器。
在这种情况下,您可以配置一个流水线:
构建应用程序并迁移镜像(第一个操作
推送至Docker Hub(第二个操作
触发数据库迁移 使用先前构建的镜像(第三个操作。您可以使用YAML文件定义镜像、命令和部署:
作业操作将等到命令执行完毕,如果退出状态不同于0,则操作将被标记为“失败”。
提交Kubernetes部署或Kubernetes设置镜像来更新K8s应用程序中的镜像。添加操作后,整个流水线将如下所示:
Buddy自动执行整个工作流程。
希望您有所收获,非常感谢您花时间阅读本文!