Kubernetes中ingress实现虚拟主机的步骤
admin
2023-03-25 19:21:40
0

环境介绍

主机IP地址服务
master192.168.1.21k8s
node01192.168.1.22k8s
node02192.168.1.23k8s

1、首先确定要运行ingress-nginx-controller服务。

在gitbub上找到所需的ingress的yaml文件

Kubernetes中ingress实现虚拟主机的步骤

Kubernetes中ingress实现虚拟主机的步骤

Kubernetes中ingress实现虚拟主机的步骤
Kubernetes中ingress实现虚拟主机的步骤

4. master下载

[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml

5. 修改 mandatory.yaml 文件

[root@master ingress]# vim mandatory.yaml
      hostNetwork: true   #213

Kubernetes中ingress实现虚拟主机的步骤

(1)执行一下
[root@master ingress]# kubectl apply -f mandatory.yaml 
(2)查看一下
[root@master ingress]# kubectl get pod -n ingress-nginx 

Kubernetes中ingress实现虚拟主机的步骤

2、将ingress-nginx-controller暴露为一个Service资源对象。

[root@master yaml]# vim service-nodeport.yaml 

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
(1)执行一下
[root@master ingress]# kubectl apply -f service-nodeport.yaml 
(2)查看一下
[root@master ingress]# kubectl get svc -n ingress-nginx 

Kubernetes中ingress实现虚拟主机的步骤

3、创建一个deployment资源,和一个service资源, 并相互关联。

[root@master yaml]# vim deploy1.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deploy1
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx1
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: nginx1
  ports:
    - port: 80
      targetPort: 80
执行一下
[root@master yaml]# kubectl apply -f deploy1.yaml 
查看一下
[root@master yaml]# kubectl get pod

Kubernetes中ingress实现虚拟主机的步骤

[root@master yaml]# kubectl get svc

Kubernetes中ingress实现虚拟主机的步骤

然后复制deploy1.yaml资源工创建另外”一对“服务。

[root@master yaml]# vim deploy2.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deploy2
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - name: nginx2
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: nginx2
  ports:
    - port: 80
      targetPort: 80
执行一下
[root@master yaml]# kubectl apply -f deploy2.yaml 
查看一下
[root@master yaml]# kubectl get deployments.

Kubernetes中ingress实现虚拟主机的步骤

4. 创建ingress的yaml文件,关联是svc1和svc2

[root@master yaml]# vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-1
spec:
  rules:
    - host: www1.bdqn.com
      http:
        paths:
        - path: /
          backend:
            serviceName: svc-1
            servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-2
spec:
  rules:
    - host: www2.bdqn.com
      http:
        paths:
        - path: /
          backend:
            serviceName: svc-2
            servicePort: 80
执行一下
[root@master yaml]# kubectl apply -f ingress.yaml 
查看一下
[root@master yaml]# kubectl get ingresses.

Kubernetes中ingress实现虚拟主机的步骤

[root@master yaml]# kubectl describe ingresses. ingress-1

Kubernetes中ingress实现虚拟主机的步骤

[root@master yaml]# kubectl describe ingresses. ingress-2

Kubernetes中ingress实现虚拟主机的步骤

5、由于实验环境限制,所以自己用来模拟-一个域名。

进入本机的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)运行所在的节点IP。

Kubernetes中ingress实现虚拟主机的步骤

访问一下
[root@master yaml]# kubectl get svc -n ingress-nginx 
//查看映射的端口

Kubernetes中ingress实现虚拟主机的步骤

http://www1.bdqn.com:30817/

Kubernetes中ingress实现虚拟主机的步骤

http://www2.bdqn.com:30817/

Kubernetes中ingress实现虚拟主机的步骤

总结上述示例的pod是如何一步一步可以使client访问到的,总结如下:

后端pod===》service====》ingress规则====》写入Ingress-nginx-controller配置文件并自动重载使更改生效===》对本机进行域名解析====》实现client通过域名的IP+端口都可以访问到后端pod

Ingress资源实现https代理安全访问。

在上面的操作中,实现了使用ingress-nginx为后端所有pod提供一个统一的入口,那么,有一个非常严肃的问题需要考虑,就是如何为我们的pod配置CA证书来实现HTTPS访问?在pod中直接配置CA么?那需要进行多少重复性的操作?而且,pod是随时可能被kubelet杀死再创建的。当然这些问题有很多解决方法,比如直接将CA配置到镜像中,但是这样又需要很多个CA证书。

这里有更简便的一种方法,就拿上面的情况来说,后端有多个pod,pod与service进行关联,service又被ingress规则发现并动态写入到ingress-nginx-controller容器中,然后又为ingress-nginx-controller创建了一个Service映射到群集节点上的端口,来供client来访问。

Kubernetes中ingress实现虚拟主机的步骤

在上面的一系列流程中,关键的点就在于ingress规则,我们只需要在ingress的yaml文件中,为域名配置CA证书即可,只要可以通过HTTPS访问到域名,至于这个域名是怎么关联到后端提供服务的pod,这就是属于k8s群集内部的通信了,即便是使用http来通信,也无伤大雅。

1. 生成证书

[root@master yaml]# mkdir https
//创建一个放置证书的目录
[root@master yaml]# cd https/
[root@master https]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=testsvc /O=testsvc"
//生成证书

Kubernetes中ingress实现虚拟主机的步骤

2. 创建secret资源, 保存证书。

[root@master https]# kubectl create secret tls tls-secret --key=tls.key --cert tls.crt

3、创建一个deploy3.yaml文件,模拟一个web服务。

[root@master yaml]# vim deploy3.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deploy3
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx3
    spec:
      containers:
      - name: nginx3
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    app: nginx3
  ports:
    - port: 80
      targetPort: 80
执行一下
[root@master https]# kubectl apply -f deploy3.yaml 
查看一下
[root@master https]# kubectl get pod

Kubernetes中ingress实现虚拟主机的步骤

[root@master https]# kubectl get svc

Kubernetes中ingress实现虚拟主机的步骤

4、创建对应的ingress规则。

[root@master https]# vim ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-3
spec:
  tls:
    - hosts:
      - www3.bdqn.com           #域名
      secretName: tls-secret    #保存的证书
  rules:
    - host: www3.bdqn.com
      http:
        paths:
        - path: /
          backend:
            serviceName: svc-3
            servicePort: 80

执行一下

[root@master https]# kubectl apply -f ingress.yaml 

查看一下

[root@master https]# kubectl get ingresses.

Kubernetes中ingress实现虚拟主机的步骤

5.查找对应service nodePort的443端口映射的端口,直接用浏览器访问即可。

进入本机的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)运行所在的节点IP。

Kubernetes中ingress实现虚拟主机的步骤

查看映射端口
[root@master https]# kubectl get svc -n ingress-nginx 

Kubernetes中ingress实现虚拟主机的步骤

https://www3.bdqn.com:31372/

Kubernetes中ingress实现虚拟主机的步骤

k8s集群利用了“一切皆为资源”的原理,把生成的ca证书当成一个公共的资源来使用,使用时只需绑定保存的ca证书即可,不像之前一样,需要一个一个的创建ca证书,然后在关联起来,方便好用又快捷。

相关内容

热门资讯

美媒证实一艘美国商船遭伊朗无人... 新华社华盛顿5月10日电 (记者徐剑梅 黄强)据美国福克斯新闻数字网报道,一艘美国商船10日在波斯湾...
特朗普声称伊朗47年来一直在“... 美国总统特朗普于当地时间5月10日在社交媒体发文,“猛烈抨击”伊朗长期“玩弄”美国和世界,同时还痛批...
学生放学回家后又返回学校坠亡,... 学生符某放学后回到家中,后又从家中返回学校,并于当晚从学校教学楼楼顶坠亡。符某父母随后将学校告上法庭...
泽连斯基称乌已向俄方提交100... 当地时间10日,乌克兰总统泽连斯基表示,乌俄双方将以“千人换千人”的方式交换战俘,乌方已向俄方提交了...
国网上海市电力公司举办“明灯引... 5月7日至9日,在第十个“中国品牌日”来临之际,国网上海市电力公司(以下简称“国网上海电力”)以“明...
字跳申请会话信息的发送方法专利... 国家知识产权局信息显示,北京字跳网络技术有限公司申请一项名为“会话信息的发送方法、装置、电子设备、存...
非开挖定向钻机厂家选择指南:郑... 导语:非开挖定向钻机作为市政管道铺设、能源管线穿越等场景的核心设备,其性能稳定性与厂家服务能力直接影...
你昂贵的DDR5内存可能是假货... 快科技5月10日消息,内存价格近期持续走高,亚洲市场出现大量假冒DDR5内存模块,且外观极具迷惑性。...
6G,迎利好!工信部批复 工信部批复6G技术试验频率。 为进一步推动我国6G技术研发、标准研制与产业化进程,工业和信息化部近日...
涉疫邮轮5名法国公民回国,一人... △“洪迪厄斯”号邮轮(资料图)法国总理勒科尔尼10日在社交媒体说,涉汉坦病毒疫情邮轮“洪迪厄斯”号上...