必知的技术知识:helm持久化部署ingres

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 必知的技术知识:helm持久化部署ingres

Ingress 是一种 Kubernetes 资源,也是将 Kubernetes 集群内服务暴露到外部的一种方式。本文将讲一讲如何用 Helm 在 Kubernetes 集群中部署 Ingress,并部署两个应用来演示 Ingress 的具体使用。


阅读本文前你需要先掌握 Helm 和一些 Kubernetes 服务暴露的相关知识点,如果你还不了解可以先读一读我之前写的 「Helm 入门指南」和「浅析从外部访问 Kubernetes 集群中应用的几种方式」这两篇文章。


部署 Ingress Controller


Ingress 只是一个统称,其由 Ingress 和 Ingress Controller 两部分组成。Ingress 用作将原来需要手x0008动配置的规则x0008__x0008抽象成一个 Ingress 对象,x0008使用 _x0008_YAML 格式的文件来创建和管理。Ingress Controller 用作通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化。


目前可用的 Ingress Controller 类型有很多,比如:Nginx、HAProxy、Traefik 等,我们将演示如何部署一个基于 Nginx 的 Ingress Controller。


这里我们使用 Helm 来部署,在开始部署前,请确认您已经安装和配置好 Helm 相关环境。


查找软件仓库中是否有 Nginx Ingress 包


1


2


3


$ helm search nginx-ingress


NAME CHART VERSION APP VERSION DESCRIPTION


stable/nginx-ingress 0.9.5 0.10.2 An nginx Ingress controller that uses ConfigMap...


注:这里我们使用的是在阿里云 Helm 镜像仓库。如果你还不知道如何增加三方x0008仓库,可先阅读 「Helm 入门指南」一文。


阿里云 Helm 镜像仓库里的 nginx-ingress 软件包已经将要用到的相关x0008__x0008容器镜像地址改成了国内可访问的地址。安装时需要用到的容器镜像有:


1


2


3


repository: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.10.2


repository: registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.3


repository: sophos/nginx-vts-exporter:0.6


使用 Helm 部署 Nginx Ingress Controller


Ingress Controller 本身对外暴露的方式有几种,比如:hostNetwork、externalIP 等。这里我们采用 externalIP 的方式进行,如果你要使用 hostNetwork 方式,可以使用 controller.hostNetwork=true参数进行x0008设置。


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66


67


68


69


70


71


72


73


74


75


76


77


78


79


80


81


82


83


84


85


86


87


88


89


90


91


92


# 启用 RBAC 支持


$ helm install --name nginx-ingress --set "rbac.create=true,controller.service.externalIPs【0】=192.168.100.211,controller.service.externalIPs【1】=192.168.100.212,controller.service.externalIPs【2】=192.168.100.213" stable/nginx-ingress


NAMESPACE: default


STATUS: DEPLOYED


RESOURCES:


==> v1/ConfigMap


NAME DATA AGE


nginx-ingress-controller 1 2m


==> v1beta1/ClusterRole


NAME AGE


nginx-ingress 2m


==> v1beta1/ClusterRoleBinding


NAME AGE


nginx-ingress 2m


==> v1beta1/RoleBinding


NAME AGE


nginx-ingress 2m


==> v1/ServiceAccount


NAME SECRETS AGE


nginx-ingress 1 2m


==> v1beta1/Role


NAME AGE


nginx-ingress 2m


==> v1/Service


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE


nginx-ingress-controller LoadBalancer 10.254.84.72 192.168.100.211,192.168.100.212,192.168.100.213 80:8410/TCP,443:8948/TCP 2m


nginx-ingress-default-backend ClusterIP 10.254.206.175 80/TCP 2m


==> v1beta1/Deployment


NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE


nginx-ingress-controller 1 1 1 1 2m


nginx-ingress-default-backend 1 1 1 1 2m


==> v1beta1/PodDisruptionBudget


NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE


nginx-ingress-controller 1 N/A 0 2m


nginx-ingress-default-backend 1 N/A 0 2m


==> v1/Pod(related)


NAME READY STATUS RESTARTS AGE


nginx-ingress-controller-665cd897fc-n5rq4 1/1 Running 0 2m


nginx-ingress-default-backend-df594cfc6-pbcxk 1/1 Running 0 2m


NOTES:


The nginx-ingress controller has been installed.


It may take a few minutes for the LoadBalancer IP to be available.


You can watch the status by running 'kubectl --namespace default get services -o wide -w nginx-ingress-controller'


An example Ingress that makes use of the controller:


apiVersion: extensions/v1beta1


kind: Ingress


metadata:


annotations:


kubernetes.io/ingress.class: nginx


name: example


namespace: foo


spec:


rules:


- host:


http:


paths:


- backend:


serviceName: exampleService


servicePort: 80


path: /


# This section is only required if TLS is to be enabled for the Ingress


tls:


- hosts:


-


secretName: example-tls


If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:


apiVersion: v1


kind: Secret


metadata:


name: example-tls


namespace: foo


data:


tls.crt:


tls.key:


type: kubernetes.io/tls


部署完成后我们可以看到 Kubernetes 服务中增加了 nginx-ingress-controller 和 nginx-ingress-default-backend 两个服务。nginx-ingress-controller 为 Ingress Controller,主要做为一个七层的负载均衡器来提供 HTTP 路由、粘性会话、SSL 终止、SSL直通、TCP 和 UDP 负载平衡等功能。nginx-ingress-default-backend 为默认的后端,当集群外部的请求通过 Ingress 进入到集群内部时,如果无法负载到相应后端的 Service 上时,这种未知的请求将会被负载到这个默认的后端上。


由于我们采用了 externalIP 方式对外暴露服务, 所以 nginx-ingress-controller 会在 192.168.100.211、192.168.100.212、192.168.100.213 三台节点宿主机上的 暴露 80/443 端口。


1


2


3


4


5


$ kubectl get svc


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE


kubernetes ClusterIP 10.254.0.1 443/TCP 18d


nginx-ingress-controller LoadBalancer 10.254.84.72 192.168.100.211,192.168.100.212,192.168.100.213 80:8410/TCP,443:8948/TCP 46s


nginx-ingress-default-backend ClusterIP 10.254.206.175 80/TCP 46s


访问 Nginx Ingress Controller


我们可以使用以下命令来获取 Nginx 的 HTTP 和 HTTPS 地址。


1


2


3


$ kubectl --namespace default get services -o wide -w nginx-ingress-controller


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR


nginx-ingress-controller LoadBalancer 10.254.84.72 192.168.100.211,192.168.100.212,192.168.100.213 80:8410/TCP,443:8948/TCP 4h app=nginx-ingress,component=controller,release=nginx-ingress


因为我们还没有在 Kubernetes 集群中创建 Ingress资源,所以直接对 ExternalIP 的请求被负载到了 nginx-ingress-default-backend 上。nginx-ingress-default-backend 默认提供了两个 URL 进行访问,其中的 /healthz 用作健康检查返回 200,而 / 返回 404 错误。


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


# 返回 200


$ curl -I


HTTP/1.1 200 OK


Server: nginx/1.13.8


Date: Tue, 24 Jul 2018 06:25:58 GMT


Content-Type: text/html


Content-Length: 0


Connection: keep-alive


Strict-Transport-Security: max-age=15724800; includeSubDomains;


# 返回 404


$ curl -I


HTTP/1.1 404 Not Found


Server: nginx/1.13.8


Date: Tue, 24 Jul 2018 06:26:39 GMT


Content-Type: text/plain; charset=utf-8


Content-Length: 21


Connection: keep-alive


Strict-Transport-Security: max-age=15724800; includeSubDomains;


# 返回 200


$ curl -I --insecure


HTTP/2 200


server: nginx/1.13.8


date: Tue, 24 Jul 2018 06:27:41 GMT


content-type: text/html


content-length: 0


strict-transport-security: max-age=15724800; includeSubDomains;


# 返回 404


$ curl -I --insecure


HTTP/2 404


server: nginx/1.13.8


date: Tue, 24 Jul 2018 06:28:25 GMT


content-type: text/plain; charset=utf-8


content-length: 21


strict-transport-security: max-age=15724800; includeSubDomains;


在几台节点宿主机上查看,我们可以看到 ExternalIP 的 Service 是通过 Kube-Proxy对外暴露的,这里的 192.168.100.211、192.168.100.212、192.168.100.213 是三个内网 IP。 实际生产应用中是需要通过边缘路由器或全局统一接入层的负载均衡器将到达公网 IP 的外网流量转发到这几个内网 IP 上,外部用户再通过域名访问集群中以 Ingress 暴露的所有服务。


1


2


3


4


5


6


7


8


9


10


11


$ sudo netstat -tlunp|grep kube-proxy|grep -E '80|443'


tcp 0 0 192.168.100.211:80 0.0.0.0: LISTEN 714/kube-proxy


tcp 0 0 192.168.100.211:443 0.0.0.0: LISTEN 714/kube-proxy


$ sudo netstat -tlunp|grep kube-proxy|grep -E '80|//代码效果参考:http://hnjlyzjd.com/hw/wz_25358.html

443'

tcp 0 0 192.168.100.212:80 0.0.0.0: LISTEN 690/kube-proxy


tcp 0 0 192.168.100.212:443 0.0.0.0: LISTEN 690/kube-proxy


$ sudo netstat -tlunp|grep kube-proxy|grep -E '80|443'


tcp 0 0 192.168.100.213:80 0.0.0.0: LISTEN 748/kube-proxy


tcp 0 0 192.168.100.213:443 0.0.0.0: LISTEN 748/kube-proxy


卸载 Nginx Ingress Controller


使用 Helm 卸载 Nginx Ingress Controller 非常的简单,只需下面一条指令就搞定了。


1


$ helm delete --purge nginx-ingress


使用 --purge 参数可以彻底删除 Release 不留下任何记录,否则下一次部署的时候不能使用重名的 Release。


部署 Ingress


接下来,我们通过 Helm 以 Ingress 方式在 Kubernetes 集群中部署两个应用。x0008由于测试环境没有使用 PersistentVolume(持久卷,简称 PV),下面两个例子中都暂时将其关闭。有关于 PersistentVolume 的知识点,我将在后面的文章来讲一讲,敬请期待。


部署 DokuWiki


DokuWiki //代码效果参考:http://hnjlyzjd.com/hw/wz_25356.html

是一个针对小公司文件需求而开发的 Wiki 引擎,用 PHP 语言开发。DokuWiki 基于文本存储,不需要数据库。因为 DokuWiki 非常的轻量,所以我选择它来做演示。

这里我们使用 Helm 官方仓库里的 Chart 包来进行,因为阿里云镜像仓库中的很多 Chart 都不是最新的版本并且不支持以 Ingress 方式部署。


1


2


# 从 Helm 官方x0008 Chart 仓库迁出所有软件包


$ git clone


使用 helm install 进行一键部署,并x0008通过 ingress.enabled=true 和 ingress.hosts【0】.name=wiki.hi-linux.com 参数启用 Ingress 特性和设置对应的主机名。


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


$ cd /home/k8s/charts/stable


$ helm install --name dokuwiki --set "ingress.enabled=true,ingress.hosts【0】.name=wiki.hi-linux.com,persistence.enabled=false" dokuwiki


NAMESPACE: default


STATUS: DEPLOYED


RESOURCES:


==> v1beta1/Ingress


NAME HOSTS ADDRESS PORTS AGE


dokuwiki-dokuwiki wiki.hi-linux.com 80 53s


==> v1/Pod(related)


NAME READY STATUS RESTARTS AGE


dokuwiki-dokuwiki-747b45cddb-qt8l2 1/1 Running 0 53s


==> v1/Secret


NAME TYPE DATA AGE


dokuwiki-dokuwiki Opaque 1 54s


==> v1/Service


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE


dokuwiki-dokuwiki LoadBalancer 10.254.235.137


80:8430/TCP,443:8848/TCP 54s


==> v1beta1/Deployment


NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE


dokuwiki-dokuwiki 1 1 1 1 54s


NOTES:


Please be patient while the chart is being deployed


1. Get the DokuWiki URL indicated on the Ingress Rule and associate it to your cluster external IP:


export CLUSTER_IP=$(minikube ip) # On Minikube. Use: kubectl cluster-info on others K8s clusters


export HOSTNAME=$(kubectl get ingress --namespace default dokuwiki-dokuwiki -o jsonpath='{.spec.rules【0】.host}')


echo "Dokuwiki URL: "


echo "$CLUSTER_IP $HOSTNAME" | sudo tee -a /etc/hosts


2. Login with the following credentials


echo Username: user


echo Password: $(kubectl get secret --namespace default dokuwiki-dokuwiki -o jsonpath="{.data.dokuwiki-password}" | base64 --decode)


部署完成后,根据提示生成相应的x0008__x0008登陆用户名和密码。


1


2


3


4


5


$ echo Username: user


Username: user


$ echo Password: $(kubectl get secret --namespace default dokuwiki-dokuwiki -o jsonpath="{.data.dokuwiki-password}" | base64 --decode)


Password: e2GrABBkwF


测试从各节点的宿主机 IP 访问应用,这里我们直接使用 Curl 命令进行访问。


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


$ curl -I -x 192.168.100.211:80


HTTP/1.1 200 OK


Server: nginx/1.13.8


Date: Wed, 25 Jul 2018 05:16:02 GMT


Content-Type: text/html; charset=utf-8


Connection: keep-alive


Vary: Accept-Encoding


X-Powered-By: PHP/7.0.31


Vary: Cookie,Accept-Encoding


Set-Cookie: DokuWiki=k2clt6f2qe472ehsq6tcmh6v20; path=/; HttpOnly


Expires: Thu, 19 Nov 1981 08:52:00 GMT


Cache-Control: no-store, no-cache, must-revalidate


Pragma: no-cache


Set-Cookie: DW68700bfd16c2027de7de74a5a8202a6f=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; HttpOnly


X-UA-Compatible: IE=edge,chrome=1


$ curl -I -x 192.168.100.212:80


HTTP/1.1 200 OK


Server: nginx/1.13.8


Date: Wed, 25 Jul 2018 05:18:13 GMT


Content-Type: text/html; charset=utf-8


Connection: keep-alive


Vary: Accept-Encoding


X-Powered-By: PHP/7.0.31


Vary: Cookie,Accept-Encoding


Set-Cookie: DokuWiki=ork8sv8qpurteblasuq3eb3nt2; path=/; HttpOnly


Expires: Thu, 19 Nov 1981 08:52:00 GMT


Cache-Control: no-store, no-cache, must-revalidate


Pragma: no-cache


Set-Cookie: DW68700bfd16c2027de7de74a5a8202a6f=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; HttpOnly


$ curl -I -x 192.168.100.213:80


HTTP/1.1 200 OK


Server: nginx/1.13.8


Date: Wed, 25 Jul 2018 05:18:30 GMT


Content-Type: text/html; charset=utf-8


Connection: keep-alive


Vary: Accept-Encoding


X-Powered-By: PHP/7.0.31


Vary: Cookie,Accept-Encoding


Expires: Thu, 19 Nov 1981 08:52:00 GMT


Cache-Control: no-store, no-cache, must-revalidate


Pragma: no-cache


Set-Cookie: DW68700bfd16c2027de7de74a5a8202a6f=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; HttpOnly


X-UA-Compatible: IE=edge,chrome=1


Curl 用法很多,你也可以使用下面方式来达到相同的效果。


1


$ curl -H "Host:wiki.hi-linux.com" ""


当然你也可以在本地 hosts 文件中对 IP 和域名进行x0008绑定后,通过浏览器访问该应

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Kubernetes 容器
使用sealer部署k8s记录
使用sealer部署k8s记录
|
8月前
|
Kubernetes API 调度
企业实战(19)基于Kubeadm工具从零开始快速部署K8S集群
企业实战(19)基于Kubeadm工具从零开始快速部署K8S集群
228 0
|
18天前
|
Kubernetes 数据处理 调度
天呐!部署 Kubernetes 模式的 Havenask 集群太震撼了!
【6月更文挑战第11天】Kubernetes 与 Havenask 集群结合,打造高效智能的数据处理解决方案。Kubernetes 如指挥家精准调度资源,Havenask 快速响应查询,简化复杂任务,优化资源管理。通过搭建 Kubernetes 环境并配置 Havenask,实现高可扩展性和容错性,保障服务连续性。开发者因此能专注业务逻辑,享受自动化基础设施管理带来的便利。这项创新技术组合引领未来,开启数据处理新篇章。拥抱技术新时代!
|
1月前
|
Kubernetes 应用服务中间件 开发工具
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(一)
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(一)
451 0
|
1月前
|
Kubernetes 网络协议 Python
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(二)
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(二)
|
存储 运维 Kubernetes
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践下——原理篇
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践下——原理篇
551 0
|
存储 Kubernetes Cloud Native
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践上——使用篇
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践上——使用篇
528 0
|
Kubernetes 容器
《GitOps:Kubernetes多集群环境下的高效CICD实践》电子版地址
GitOps:Kubernetes多集群环境下的高效CICD实践
96 0
《GitOps:Kubernetes多集群环境下的高效CICD实践》电子版地址
|
jenkins Java 持续交付
jenkins持续集成从0入门到实战【十】jenkins集群多节点
在实际工作中,如果Job非常多且构建频繁,`jenkins`的服务在效率上很难够支持。所以这种情况下我们更多的是采用1主多从的方式去进行构建,master节点主要做任务分发和调度,实际构建job的是slave节点,这时候我们就需要创建主从节点。
387 0
jenkins持续集成从0入门到实战【十】jenkins集群多节点
|
存储 运维 Kubernetes
【K8S专栏】Kubernetes数据持久化管理
【K8S专栏】Kubernetes数据持久化管理