上一篇文章《从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 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 ME 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。
更多关于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猪齿鱼社区,共同为企业数字化服务打造一个开放的生态平台。
来源:oschina
链接:https://my.oschina.net/u/3859216/blog/2967647