上一篇文章《从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
Welcome to nginx!
Welcome to nginx!
If you see this page,the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to
"http://nginx.org/">nginx.org.
Commercial support is available at
"http://nginx.com/">nginx.com.
Thank you for uesing nginx.
复制代码
更多关于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: 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 80/TCP 56s
复制代码
可以看到Pod对应的Service已经建好了,而这个“对应”就是依靠Service里面的Selector与Pod的Labels建立映射的(即Selector内容与Pod的Labels内容需一致)。现在集群内部可以通过该Service访问到Nginx,Choerodon中提供了Service的可视化创建操作,可以更加方便便捷的创建网络:
[root@localhost~]# curl 10.233.47.128
Welcome to nginx!
Welcome to nginx!
If you see this page,the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to
"http://nginx.org/">nginx.org.
Commercial support is available at
"http://nginx.com/">nginx.com.
Thank you for uesing nginx.
复制代码
更多关于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-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的介绍请参考这里: 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猪齿鱼社区,共同为企业数字化服务打造一个开放的生态平台。