传统Kubernetes应用搭建

创建Namespace

在一个Kubernetes集群中可以创建多个Namespace进行“环境隔离”,当项目和人员众多的时候,可以考虑根据项目的实际情况(例如生产、测试、开发)划分不同的Namespace。

创建一个名称为“nginx”的Namespace:

[root@localhost~]# kubectl create ns nginx

namespace "nginx" created

查看集群中已创建出来的Namespace:

[root@localhost~]# kubectl get ns

NAME          STATUS   AGE
default Active 35d
kube-public Active 35d
kube-system Active 35d
nginx Active 19s

创建Deployment

Deployment为Pod 和Replica Set(下一代Replication Controller)提供声明式更新。只需要在 Deployment 中描述想要的目标状态是什么,Deployment Controller 就会帮开发者将 Pod 和 ReplicaSet 的实际状态改变成目标状态。开发者可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。使用Deployment能够更加方便地管理Pod,包括扩容、缩容、暂停、滚动更新、回滚等。在Choerodon中用实例的方式来展现Deployment,同时支持在线升级,停止,删除等多元化功能。

典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

编写名为dp.yaml文件,内容如下:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx
labels:
app: nginx
spec:
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13.5-alpine
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80

保存后使用kubectl命令部署:

[root@localhost~]# kubectl apply -f dp.yaml

deployment.apps"nginx-deployment"created

可执行下面命令查看部署出来的Deployment:

[root@localhost~]# kubectl get deployment -n nginx

NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
inx-deployment 1 1 1 1 51s

可执行下面命令查看Deployment创建出来的Pod:

[root@localhost~]# kubectl get pod -n nginx -o wide

NAME                                 READY    STATUS    RESTARTS   AGE     IP                 NODE
nginx-deployment-866d7c64c7-8rnd5 1/1 Running 0 3m 10.233.68.248 clusternode11

Pod状态为Running,说明已经正常工作了就可以在集群中通过Pod IP进行访问了:

[root@localhost~]# curl 10.233.68.248

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body{
width:35em;
margin:0 auto;
font-family:Tahoma,Verdana,Arial,sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!<h1>
<p>If you see this page,the nginx web server is successfully installed and working. Further configuration is required.</P> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for uesing nginx.</em></p>
</body>
</html>

更多关于Deployment的介绍请参考这里: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

创建Service

Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束。 通过 Deployment 能够动态地创建和销毁 Pod。 每个 Pod 都会获取它自己的 IP 地址,然而这些IP地址并不是稳定固定的,在销毁Pod时这些IP也会进行回收。 这会导致一个问题:在 Kubernetes 集群中,如果一组 Pod(称为 Backend)为其它Pod (称为 Frontend)提供服务,那么那些 Frontend 该如何发现,并连接到这组 Pod 中的哪些 Backend 呢?

这里要隆重的请出Service来解决这个问题。

编写名为svc.yaml文件,内容如下:

apiVersion: v1
kind: Service
metadata:
namespace: nginx
name: nginx-service
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80

使用kubectl命令部署:

[root@localhost~]# kubectl apply -f svc.yaml

service "nginx-service"created

可执行下面命令查看部署出来的Service:

[root@localhost~]# kubectl get svc -n nginx

NAME            TYPE          CLUSTER-IP       EXTERNAL-IP      PORT(S)     AGE
nginx-service ClusterIP 10.233.47.128 <none> 80/TCP 56s

可以看到Pod对应的Service已经建好了,而这个“对应”就是依靠Service里面的Selector与Pod的Labels建立映射的(即Selector内容与Pod的Labels内容需一致)。现在集群内部可以通过该Service访问到Nginx,Choerodon中提供了Service的可视化创建操作,可以更加方便便捷的创建网络:

[root@localhost~]# curl 10.233.47.128

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body{
width:35em;
margin:0 auto;
font-family:Tahoma,Verdana,Arial,sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!<h1>
<p>If you see this page,the nginx web server is successfully installed and working. Further configuration is required.</P> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for uesing nginx.</em></p>
</body>
</html>

更多关于Service的介绍请参考这里: https://kubernetes.io/docs/concepts/services-networking/service/

创建Ingress

此时,只有集群内部和所在主机能访问Nginx,要让节点外的其他主机能够访问,还得需要创建Ingress。Ingress 可以给 Service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等功能。Ingress对应了Choerodon中的域名,Choerodon中除了对域名的管理外还添加了域名证书的管理,支持在线申请和导入。

编写名为ing.yaml文件,内容如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
namespace: nginx
spec:
rules:
- host: nginx.example.local #此域名需解析到k8s集群负载主机IP
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80
path: /

使用kubectl命令部署:

[root@localhost~]# kubectl apply -f ing.yaml

ingress.extensions "nginx-ingress" created

可执行下面命令查看部署出来的Ingress:

[root@localhost~]# kubectl get ingress -n nginx

NAME             HOSTS                    ADDRESS    PORTS     AGE
nginx-ingress nginx.example.local 80 1m

此时,就可以在浏览器中使用定义的URL访问Nginx了:

更多关于Ingress的介绍请参考这里: https://kubernetes.io/docs/concepts/services-networking/ingress/

看完传统Kubernetes的应用搭建后,来看看Choerodon中如何进行应用搭建吧。

基于Choerodon的应用搭建

一键部署

Choerodon中的应用部署简单明了,其构建了一套环境,实例,服务,域名的对象来进行Kubernetes的基础对象映射,为Kubernetes基础对象的创建和修改提供了可视化的操作界面。

在Choerodon猪齿鱼平台部署一个应用只需要在“应用管理”页面点击“创建应用”,并在“开发流水线”创建分支,提交代码后发布应用,在“部署流水线”页面选择要部署的应用,版本,目标环境,部署模式,设置好网络、域名即完成应用的部署。

那Choerodon在应用的搭建的背后又做了哪些事情呢?这就不得不提到GitOps了。

GitOps

Choerodon采用Kubernetes作为基础平台,通过Helm Chart打包应用,将Helm Release抽象成Kubernets自定义对象,这样就能通过Kubernetes资源对象文件描述整个环境部署应用系统的状态。在Choerodon中将应用搭建最终生成的yaml文件以配置库的方式存储在GitLab中,通过对比配置yaml文件的改动来判断应用的搭建状态,实现业务代码与配置代码的分离。

同时用户在平台中创建环境时会同步创建一个与环境对应的Git仓库用来存放部署配置文件,之后所有在环境中部署的相关操作,都会转化为Git库中部署配置文件的操作,同时触发Choerodon部署服务进行状态记录,应用状态记录后触发Choerodon在Kubernetes中的Agent进行应用部署。最终可以根据配置库,Choerodon部署服务状态记录,Choerodon Agent来诠释整个应用部署所经历的流程。

总结

以上步骤可以看出,从构建程序到外部访问,K8S提供了Namespace, Deployment, Service, Ingress等基础对象。以此为基础,Choerodon猪齿鱼平台构建了一套环境,实例,服务,域名的对象来进行映射,包括滚动升级、容错提高、服务测试等,并以友好的UI界面管理进行管理,使用户可以简单的通过页面进行Kubernetes的对象操作,从而创建自己的应用。

Choerodon猪齿鱼平台不仅实现一键部署,平台还提供了完备的测试管理,用于对新发布应用的测试。知识管理模块提供了企业内部的信息分享平台,报表模块则能够提供更为详细的开发、迭代信息。Choerodon猪齿鱼平台提升了K8S持续集成、持续部署的能力,使各个基础平台的耦合性更高,更加适用于企业实践DevOps。


本文由猪齿鱼技术团队原创,转载请注明出处

从0到1使用Kubernetes系列(四):搭建第一个应用程序的更多相关文章

  1. 从0到1使用Kubernetes系列(二):安装工具介绍

    该系列第一篇为:<从0到1使用Kubernetes系列--Kubernetes入门>.本文是Kubernetes系列的第二篇,将介绍使用Kubeadm+Ansible搭建Kubernete ...

  2. 从0到1使用Kubernetes系列(八):Kubernetes安全

    本文是从 0 到 1 使用 Kubernetes 系列第八篇,上一篇从0到1使用Kubernetes系列(七):网络介绍了 K8S 网络相关的内容,本文将带你了解 K8S 的安全问题. Kuberne ...

  3. Kubernetes系列(四) StatefulSet

    作者: LemonNan 原文地址: https://juejin.im/post/6870071267438329869 Kubernetes系列(四) StatefulSet Kubernetes ...

  4. 从0到1使用Kubernetes系列(六):数据持久化实战

    本文是从 0 到 1 使用 Kubernetes 系列第六篇,上一篇<从 0 到 1 使用 Kubernetes 系列(五):Kubernetes Scheduling>介绍了 Kuber ...

  5. 从0到1使用Kubernetes系列(七):网络

    本文是从 0 到 1 使用 Kubernetes 系列第七篇,上一篇<从 0 到 1 使用 Kubernetes 系列(六):数据持久化实战> 介绍了 Kubernetes 中的几种常用储 ...

  6. 从0到1使用Kubernetes系列(三):使用Ansible安装Kubernetes集群

    前两期的文章介绍了Kubernetes基本概念和架构,用Kubeadm+Ansible搭建Kubernetes集群所需要的工具及其作用.本篇介绍怎么使用Ansible安装Kubernetes集群. 启 ...

  7. 【Kubernetes 系列四】Kubernetes 实战:管理 Hello World 集群

    目录 1. 创建集群 1.1. 安装 kubectl 1.1.1. 安装 kubectl 到 Linux 1.1.2. 安装 kubectl 到 macOS 1.1.3. 安装 kubectl 到 W ...

  8. 从0到1使用Kubernetes系列——Kubernetes入门

    基本概念 Docker 是什么 Docker 起初是 dotCloud 公司创始人 Solomon Hykes 在法国的时候发起的一项公司内部项目,Docker 是基于 dotCloud 公司多年云服 ...

  9. 从0到1使用Kubernetes系列(五):Kubernetes Scheduling

    前述文章介绍了Kubernetes基本介绍,搭建Kubernetes集群所需要的工具,如何安装,如何搭建应用.本篇介绍怎么使用Kubernetes进行资源调度. Kubernetes作为一个容器编排调 ...

随机推荐

  1. RSA及其证明 [原创]

    描述RSA的实现步骤介绍文章非常多,但说明并证明其原理,并进而讨论为什么这样设计的文章不多.本人才疏学浅,不敢说理解了R.S.A.三位泰斗的设计初衷,简单就自己的理解写一写,博大家一笑. 以下原创内容 ...

  2. FastAPI(4)- get 请求 - 路径参数 Path Parameters

    什么是路径 假设一个 url 是: http://127.0.0.1:8080/items/abcd 那么路径 path 就是 /items/abcd 路径参数 就是将路径上的某一部分变成参数,可通过 ...

  3. 基于React和GraphQL的黛梦设计与实现

    写在前面 这是笔者在中秋无聊写着玩的,假期闲暇之余憋出来的帖子.麻雀虽小,但五脏俱全,涉及到的方方面面还是蛮全的.所以就设计了一个黛梦(demo)------ 打通了GraphQL的接口与前端交互的流 ...

  4. 谷歌浏览器chrome安装插件报"程序包无效: CRX_HEADER_INVALID"错误

    今天参加需求评审,看到原来可以谷歌浏览器查看Axure原型文件,真是只有想不到,没有做不到(自己孤陋寡闻了,第一次接触Axure). 需求评审后,我百度"如何使用谷歌浏览器查看Axure原型 ...

  5. 进入vim /etc/profile如何退出

    按o或i输入 按Esc,输入:wq,退出

  6. jmeter加密解密(解密篇)

    上一篇已经讲解了公钥加密,这篇讲解公钥解密.解密比较简单,直接操作吧. 需求是:接口中的请求体的部分参数需要先加密再请求,返回的结果中部分字段需解密. 1.在请求下新建beanshell后置处理程序, ...

  7. mysql where in 数组解决小tips

    由于sql语法要求,不可在in后面直接连数组,若数组形式下,则需要转换成逗号隔开的字符串 <?php$arr = array(1,2,3,4,5);$arr_string= join(',', ...

  8. wordpress 搭建

    wordpress 搭建: 公司要使用自建地图.选用了国外的Mapplic .但是Mapplic不支持直接编辑地图,需要用json的格式定义.但是wordpress版本的就有这个鬼东西,所以搞了一个这 ...

  9. Python3入门系列之-----函数

    什么是函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己 ...

  10. Java类加载器概述

    Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...