溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes 使用 ingress 配置 https 集群(十五)

發(fā)布時(shí)間:2020-06-28 03:44:12 來源:網(wǎng)絡(luò) 閱讀:3344 作者:wzlinux 欄目:云計(jì)算

[TOC]

一、背景

1.1 需求

我們有這樣的一個(gè)需求,就是把 Pod 集群升級為 https,目前的辦法就是要么每個(gè)容器配置 https,然后前端通過 Service 進(jìn)行調(diào)度,但是這樣配置起來會(huì)比較麻煩,以及每個(gè)容器的建立都通過 https ,也增加了建立連接的負(fù)擔(dān)。

我們需要一種這樣的改造,就是客戶端連接到 Service 是通過 https,而 Service 向后端 Pod 的調(diào)度通過 http,這樣可以極大的優(yōu)化我們的集群,這里我們就需要用到 Kubernetes 的另外一種資源 Ingress。

Kubernetes 使用 ingress 配置 https 集群(十五)

1.2 Ingress

Ingress 就是一個(gè)負(fù)載均衡的應(yīng)用,它和 Service 的不同之處在于,Service 只可以支持 4 層的負(fù)載均衡,而 Ingress 是支持 7 層的負(fù)載均衡,支持 http 和 https,包括通過主機(jī)名的訪問已經(jīng)路徑訪問的過濾。

那為什么不直接使用 Nginx?這是因?yàn)樵?K8S 集群中,如果每加入一個(gè)服務(wù),我們都在 Nginx 中添加一個(gè)配置,其實(shí)是一個(gè)重復(fù)性的體力活,只要是重復(fù)性的體力活,我們都應(yīng)該通過技術(shù)將它干掉。

Ingress就可以解決上面的問題,其包含兩個(gè)組件Ingress ControllerIngress

  • Ingress:將Nginx的配置抽象成一個(gè)Ingress對象,每添加一個(gè)新的服務(wù)只需寫一個(gè)新的Ingress的yaml文件即可;
  • Ingress Controller:將新加入的 Ingress 轉(zhuǎn)化成 Nginx 的配置文件并使之生效,包含 Contour、F5、HAProxy、Istio、Kong、Nginx、Traefik,官方推薦我們使用 Nginx。

Kubernetes 使用 ingress 配置 https 集群(十五)

1.3 環(huán)境介紹

我們是采用了三臺(tái)服務(wù)器的一個(gè)集群,部署文檔請查看我之前的博文。

IP 角色
192.168.1.200 k8s-master
192.168.1.201 k8s-node01
192.168.1.202 k8s-node02
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   117s   v1.13.0
node01   Ready    <none>   52s    v1.13.0
node02   Ready    <none>   42s    v1.13.0

二、安裝部署

我們這里只針對上面架構(gòu)圖中的域名www.wzlinux.com改造成https。

我們將以官方的標(biāo)準(zhǔn)腳本為基礎(chǔ)進(jìn)行搭建,參考請戳官方文檔。官方文檔中要求執(zhí)行如下命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

2.1、創(chuàng)建后端 Pod 應(yīng)用

我們創(chuàng)建一個(gè)控制器wzlinux-deploy.yaml,內(nèi)容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wzlinux-dep
spec:
  replicas: 3
  template:
    metadata:
      labels:
        run: wzlinux
    spec:
      containers:
      - name: wzlinux
        image: wangzan18/mytest:v1
        ports:
        - containerPort: 8080

創(chuàng)建好之后查看如下:

[root@master ingress]# kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
wzlinux-dep-78d5d86c7c-fj8f5   1/1     Running   0          53m
wzlinux-dep-78d5d86c7c-hr6gd   1/1     Running   0          53m
wzlinux-dep-78d5d86c7c-jqf59   1/1     Running   0          53m

2.2 創(chuàng)建后端 Pod Service

測試好 Pod 一些正常之后,我們?yōu)檫@一組 Pod 創(chuàng)建一個(gè) Service,文件wzlinux-svc.yaml內(nèi)容如下:

apiVersion: v1
kind: Service
metadata:
  name: wzlinux-svc
spec:
  selector:
    run: wzlinux
  ports:
  - port: 80
    targetPort: 8080

這個(gè) Service 并不是我們用了代理訪問 Pod 的,只是用來ingress-controller來進(jìn)行選擇控制使用的,所以上圖描述為虛線。

[root@master ingress]# kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    58m
wzlinux-svc   ClusterIP   10.106.219.230   <none>        8080/TCP   50m
[root@master ingress]# curl 10.106.219.230:8080
Hello Kubernetes bootcamp! | Running on: wzlinux-dep-78d5d86c7c-fj8f5 | v=1

2.3、創(chuàng)建 ingress 資源

為了實(shí)現(xiàn)過濾以及 https 功能,我們需要?jiǎng)?chuàng)建 ingress 資源文件,ingress controller 把其中的資源加載到 nginx 里面,資源文件wzlinux-ingress.yaml文件內(nèi)容如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wzlinux-ingress
spec:
  rules:
  - host: www.wzlinux.com
    http:
      paths:
      - path:
        backend:
          serviceName: wzlinux-svc
          servicePort: 8080

我們這里先不改為 https,先使用虛擬主機(jī)域名過濾模式,創(chuàng)建好資源之后查看

[root@master ingress]# kubectl get ingress
NAME              HOSTS             ADDRESS   PORTS   AGE
wzlinux-ingress   www.wzlinux.com             80      37m

可以看到配置了域名www.wzlinux.com,其他地址訪問將返回404。

2.4、為 Nginx Pod 創(chuàng)建 Service

我們可以查看部署的 Nginx Pod 容器,我們設(shè)定的 ingress 資源會(huì)被 controller 更新到里面,我們可以查看如下:

[root@master ingress]# kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-766c77b7d4-dlcpf   1/1     Running   0          31m

為了是外網(wǎng)可以訪問到這個(gè) Nginx Pod,我們需要為其再創(chuàng)建一個(gè) Service,文件ingress-nginx.yaml,文件內(nèi)容如下:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30080
  - name: https
    port: 443
    targetPort: 443
    nodePort: 30443
  selector:
    app.kubernetes.io/name: ingress-nginx

測試是否正常,記得在/etc/hosts中把域名執(zhí)行的IP改為node節(jié)點(diǎn)的地址。

[root@master ~]# curl 192.168.1.200:30080
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h2>404 Not Found</h2></center>
<hr><center>nginx/1.15.6</center>
</body>
</html>
[root@master ~]# curl www.wzlinux.com:30080
Hello Kubernetes bootcamp! | Running on: wzlinux-dep-78d5d86c7c-hr6gd | v=1

可以看到通過域名訪問正常調(diào)度到后端,其他地址訪問返回404,目前整個(gè)流程已經(jīng)測試完成,下面我們升級為 https。

三、升級為 https

3.1 首先我們要制作證書

關(guān)于證書大家可以使用 openssl 制作,創(chuàng)建私有:

openssl genrsa -out wzlinux.key 2048

制作自簽證書。

openssl req -new -x509 -key wzlinux.key -out wzlinux.crt -subj /C=CN/ST=Shanghai/L=Shanghai/O=DevOps/CN=www.wzlinux.com

不過我這里使用阿里云的官方免費(fèi)證書,大家可以到阿里云進(jìn)行申請。
Kubernetes 使用 ingress 配置 https 集群(十五)

Kubernetes 使用 ingress 配置 https 集群(十五)
制作好證書之后下載即可,里面包含公鑰和私鑰。

3.2、創(chuàng)建 secret 資源

可以使用 yaml 文件創(chuàng)建,文件名稱wzlinux-secret.yaml內(nèi)容如下:

apiVersion: v1
kind: Secret
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
metadata:
  name: wzlinux-secret
  namespace: default
type: Opaque

因?yàn)榫幋a的密碼太長,我們這里直接使用命令行進(jìn)行創(chuàng)建吧,操作比較簡單。

kubectl create secret tls wzlinux-secret --cert=wzlinux.crt --key=wzlinux.key

查看創(chuàng)建好的 secret。

[root@master ingress]# kubectl describe secret wzlinux-secret
Name:         wzlinux-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/tls

Data
====
tls.crt:  1996 bytes
tls.key:  1675 bytes

3.3 更改 ingress 資源

重新編輯wzlinux-ingress.yaml,增加一個(gè) tls 字段:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wzlinux-ingress
spec:
  tls:
  - hosts:
    - www.wzlinux.com
    secretName: wzlinux-secret
  rules:
  - host: www.wzlinux.com
    http:
      paths:
      - path:
        backend:
          serviceName: wzlinux-svc
          servicePort: 8080

3.4 瀏覽器訪問驗(yàn)證

打開瀏覽器,記得修改好 hosts 域名解析。
Kubernetes 使用 ingress 配置 https 集群(十五)

四、ingress 資源介紹

4.1、通過訪問路徑過濾

foo.bar.com -> 178.91.123.132 -> / foo    service1:4200
                                 / bar    service2:8080

配置文件我們設(shè)置為如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: service1
          servicePort: 4200
      - path: /bar
        backend:
          serviceName: service2
          servicePort: 8080

4.2、基于名稱解析的虛擬主機(jī)

foo.bar.com --|                 |-> foo.bar.com s1:80
              | 178.91.123.132  |
bar.foo.com --|                 |-> bar.foo.com s2:80

配置文件內(nèi)容格式如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: first.bar.com
    http:
      paths:
      - backend:
          serviceName: service1
          servicePort: 80
  - host: second.foo.com
    http:
      paths:
      - backend:
          serviceName: service2
          servicePort: 80
  - http:
      paths:
      - backend:
          serviceName: service3
          servicePort: 80

4.3、https

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
    - sslexample.foo.com
    secretName: testsecret-tls
  rules:
    - host: sslexample.foo.com
      http:
        paths:
        - path: /
          backend:
            serviceName: service1
            servicePort: 80
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI