Настройте доступ к доменному имени через Ingress в k8s

Kubernetes

В прошлой статье мы развернули первое приложение с помощью k8s, теперь мы можем использоватьIngressСделайте его доступным в Интернете (конечно, вы должны иметь собственное доменное имя и указать его правильно)

Ниже приведен официальный сайт для перемещенияIngressДиаграмма для описания того, что делает Ingress. Если вы ничего об этом не знаете, вы можете понять это как традиционный nginx, который используется для настройки доменного имени вашего сайта, чтобы к нему можно было получить доступ через внешнюю сеть.

internet
    |
[ Ingress ]
--|-----|--
[ Services ]

в,IngressСодержит два компонента

  • Ingress: настроить правила переадресации, аналогичные конфигурационному файлу nginx.
  • Ingress Controller: вперед, аналогично nginx, будет читатьIngressправила и превратиться вnginxфайл конфигурации

иIngress ControllerКромеnginxв дополнении кhaproxy,ingressждите, мы выбираемnginxв качестве Ingress-контроллера

Разверните nginx Ingress Controller с помощью helm

Используем helm для выбора официальногоstable/nginx-ingressграфик для развертывания.

nginx-ingressНастроит тип какLoadBalancerсервис,Так что надо настроитьEXTERNAL-IPЭто IP-адрес узла кластера k8s.Здесь external-ip будет установлен на[172.17.68.39, 172.17.68.40]

мы можем пройтиkubectl get nodesчтобы получить IP-адрес

# 获取node的 INTERNAL-IP,作为 LoadBalancer 的 EXTERNAL-IP
$ kubectl get nodes -o wide
NAME       STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
shanyue    Ready    master   13d   v1.16.0   172.17.68.39   <none>        CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.6.2
shuifeng   Ready    <none>   13d   v1.16.0   172.17.68.40   <none>        CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.6.2

Здесь external-ip будет установлен на[172.17.68.39, 172.17.68.40]

controller.service.externalIPs[0]=172.17.68.39
controller.service.externalIPs[1]=172.17.68.40
# 使用 helm v3 部署,如果使用 helm v2 部署的话,把 release-name 使用 --name 指定
$ helm install nginx-ingress stable/nginx-ingress --set "controller.service.externalIPs[0]=172.17.68.39,controller.service.externalIPs[1]=172.17.68.40"
NAME: nginx-ingress
LAST DEPLOYED: 2019-10-18 21:21:44.115902395 +0800 CST m=+1.904554085
NAMESPACE: default
STATUS: deployed
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: www.example.com
        http:
          paths:
            - backend:
                serviceName: exampleService
                servicePort: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
        - hosts:
            - www.example.com
          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: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

Проверить развертывание nginx-ingress

$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART
nginx-ingress   default         1               2019-10-18 11:21:44.115902395 +0800 CST deployed        nginx-ingress-1.24.0

# 查看 nginx-ingress 所有的 service
$ kubectl get svc -l app=nginx-ingress
NAME                            TYPE           CLUSTER-IP     EXTERNAL-IP                 PORT(S)                      AGE
nginx-ingress-controller        LoadBalancer   10.101.64.64   172.17.68.39,172.17.68.40   80:30285/TCP,443:31094/TCP   7m19s
nginx-ingress-default-backend   ClusterIP      10.110.76.15   <none>                      80/TCP                       7m19s

Настройте Ingress для сопоставления доменных имен

Связь с известными знаниями помогает нам лучше усваивать новые знания. Ниже приведен простой файл конфигурации для развертывания приложения блога с помощью nginx и ingress.

  1. Доступ к приложению из внешней сети осуществляется через доменное имя nginx.xiange.tech.
  2. Прокси-сервис nginx для балансировки нагрузки
  3. nginx открывает порт 80
server {
  listen 80
  server_name nginx.xiange.tech

  location / {
    proxy_pass: http://nginx:80
  }
}

использоватьIngressНастройте правила маршрутизации следующим образом

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-service-ingress
spec:
  rules:
  - host: nginx.xiange.tech
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
        path: /

Мы используемIngressнастроить его наnginx.xiange.techПод этим доменным именем откройте доменное имя в браузере в общедоступной сетевой среде.nginx.xiange.tech, вы можете увидеть знакомую страницу конфигурации nginx

резюме

Развернуть приложение изDeployment,ServiceсноваIngressПолный файл конфигурации выглядит следующим образом

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-service-ingress
spec:
  rules:
  - host: nginx.xiange.tech
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
        path: /

Подписывайтесь на меня

Добро пожаловать в публичный аккаунтГорная Луна Путешествие, я буду регулярно делиться некоторыми статьями о внешнем и внутреннем интерфейсе, эксплуатации и обслуживании, а также будет ежедневный обзор и сводка технологий и жизни, добро пожаловать, чтобы обратить внимание на обмен

欢迎关注公众号山月行,我会定期分享一些前后端以及运维的文章