上一篇文章《从0到1使用Kubernetes系列(三):使用Ansible安装Kubernetes集群》中,我们搭建了一套Kubernetes集群,接下来将在本文中介绍如何使用Kubernetes部署一个Nginx并通过Pod IP、Service IP、Ingress这三种方式访问Nginx。

传统Kubernetes应用搭建

创建Namespace

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

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

[root@localhost~]# kubectl create ns nginxnamespace "nginx" created
复制代码

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

[root@localhost~]# kubectl get nsNAME          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-deploymentnamespace: nginxlabels:app: nginx
spec:replicas: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.13.5-alpineports:- containerPort: 80readinessProbe:httpGet:path: /port: 80
复制代码

保存后使用kubectl命令部署:

[root@localhost~]# kubectl apply -f dp.yamldeployment.apps"nginx-deployment"created
复制代码

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

[root@localhost~]# kubectl get deployment -n nginxME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
inx-deployment     1         1         1            1           51s
复制代码

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

[root@localhost~]# kubectl get pod -n nginx -o wideNAME                                 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的介绍请参考这里: kubernetes.io/docs/concep…

创建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: nginxname: nginx-service
spec:selector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80
复制代码

使用kubectl命令部署:

[root@localhost~]# kubectl apply -f svc.yamlservice "nginx-service"created
复制代码

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

[root@localhost~]# kubectl get svc -n nginxNAME            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的介绍请参考这里: kubernetes.io/docs/concep…

创建Ingress

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

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: nginx-ingressnamespace: nginx
spec:rules:- host: nginx.example.local #此域名需解析到k8s集群负载主机IPhttp:paths:- backend:serviceName: nginx-serviceservicePort: 80path: /
复制代码

使用kubectl命令部署:

[root@localhost~]# kubectl apply -f ing.yamlingress.extensions "nginx-ingress" created
复制代码

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

[root@localhost~]# kubectl get ingress -n nginxNAME             HOSTS                    ADDRESS    PORTS     AGE
nginx-ingress    nginx.example.local                 80        1m
复制代码

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

更多关于Ingress的介绍请参考这里: kubernetes.io/docs/concep…

看完传统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。

更多关于Kubernetes的文章,点击蓝字可阅读 ▼

  • 从0到1使用Kubernetes系列(一)——Kubernetes入门
  • 从0到1使用Kubernetes系列(二)——安装工具介绍
  • 从0到1使用Kubernetes系列(三):使用Ansible安装Kubernetes集群

关于Choerodon猪齿鱼

Choerodon猪齿鱼是一个开源企业服务平台,是基于Kubernetes的容器编排和管理能力,整合DevOps工具链、微服务和移动应用框架,来帮助企业实现敏捷化的应用交付和自动化的运营管理的开源平台,同时提供IoT、支付、数据、智能洞察、企业应用市场等业务组件,致力帮助企业聚焦于业务,加速数字化转型。

大家可以通过以下社区途径了解猪齿鱼的最新动态、产品特性,以及参与社区贡献:

  • 官网:choerodon.io
  • 论坛:forum.choerodon.io
  • Github:github.com/choerodon/
  • 微信:Choerodon猪齿鱼
  • 微博:Choerodon猪齿鱼

欢迎加入Choerodon猪齿鱼社区,共同为企业数字化服务打造一个开放的生态平台。

从0到1使用Kubernetes系列(四):搭建第一个应用程序相关推荐

  1. Remoting系列(二)----建立第一个入门程序

    http://www.cnblogs.com/Ring1981/archive/2006/07/23/455043.aspx Remoting系列(二)----建立第一个入门程序 下面的Remotin ...

  2. springcloud系列四 搭建服务模块重点讲解

    首先这个服务地址:一定不要写错,是自己注册中心开启的地址 如果注意到这些了,可以简单的进行操作,也可以不需要mybatis与数据库连接,在controller里直接返回相应的数据可以了,不用这么幸苦的 ...

  3. Kubernetes系列之五:使用yaml文件创建service向外暴露服务

    系列链接 Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo Kubernetes系列之二:将Slave节点加入集群 Kubernetes系列之三:部署你的第一个应用程序到k8s集 ...

  4. 【云原生Kubernetes系列第五篇】kubeadm v1.20 部署K8S 集群架构(人生这道选择题,总会有遗憾)

    系列文章目录 ??即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔 ??收录至专栏 云原生 ??[云原生Docker系列第一篇]Docker镜像管理 ??[云原生Docker系列第二篇]Do ...

  5. VMware View 5.0从菜鸟到高手系列 10 –远程图形工作站配置篇

    本文档依照PCoIP设备供应商丽台(Leadtek)提供的零客户机VP200P以及PCoI卡VP200H为例,为了介绍整个安装步骤.以下配置在VMware view 4.5中安装,但在更新的版本中如V ...

  6. sed修炼系列(四):sed中的疑难杂症

    sed系列文章: sed修炼系列(一):花拳绣腿之入门篇 sed修炼系列(二):武功心法(info sed翻译+注解) sed修炼系列(三):sed高级应用之实现窗口滑动技术 sed修炼系列(四):s ...

  7. 机器学习入门系列四(关键词:BP神经网络)

    机器学习入门系列四(关键词:BP神经网络) 标签: 机器学习神经网络 2016-01-12 15:28 80人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 机器学习(3) 作者同类文章X 版 ...

  8. 掌握XML系列(四)---创建格式良好的XML文档

    掌握XML系列(四)---创建格式良好的XML文档 前言:创建良好格式的XML文档,虽然写了这些,其实,等到大家真正的看完之后美酒会发现,其实也很简单的,我们这里所做的是带着大家全面的看看怎么样创建. ...

  9. 分布式系列四: HTTP及HTTPS协议

    分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...

最新文章

  1. JVM---堆(逃逸分析与代码优化)
  2. [转] MySQL 查询表数据大小的总结
  3. 具有Stormpath和Spring Boot的OAuth 2.0令牌管理
  4. 数组之间的计算matlab,matlab中的矩阵运算和数组运算方法
  5. 学习进度条(第九周)
  6. mysql 5.6批处理慢_java – JDBC批处理执行速度极慢
  7. 联想x3850x6从u盘引导_联想笔记本bios设置u盘启动教程
  8. 某些特殊悼念日的时候,让个人网页风格变黑灰色
  9. 饮水机和水桶图解RAID方式,强烈推荐
  10. mysql用户域账户登录_使用本地系统帐户和域用户帐户两者区别(microsoft SQLServer2000...
  11. 腾讯QQ就“读取浏览器历史记录”道歉!
  12. 计算机图形学方向的基本能力
  13. 【FlashDB】第二步 FlashDB 移植 STM32L475 使用QSPI驱动外部 flash W25Q64之 SFUD 移植
  14. pthread_cond_signal与pthread_cond_broadcast的使用区别
  15. C语言训练-1522-对称矩阵的判定
  16. uniapp下拉刷新避坑指南
  17. Huawei 華為 MT7-TL10开机卡 logo卡开机画面 使用UFED完美导出客户数据资料
  18. flickr slack_Slack&Flickr的创始人如何将巨大的失败变成十亿美元的公司
  19. 手机显示系统检测您正在通过代理服务器,当手机无线网出现“检测到您正在使用多个终端共享上网,网络访问被冻结15...
  20. 教师资格证信息技术教案

热门文章

  1. mysql脚本模式创建索引_mysql创建脚本索引范例
  2. 分析以太网帧结构_传统以太网中的——中继器及集线器
  3. 训练的神经网络不工作?一文带你跨过这37个坑
  4. BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)
  5. 新华社:华尔街专家警告2019年美股或面临剧烈调整
  6. 线程的基本协作和生产者消费者
  7. Winform-图片上传
  8. 3.cocos2dx它Menu,由menu为了实现场景切换
  9. [BT5]信息收集1-2 Dnsmap
  10. [置顶] 均衡音效