【从零开始搭建k8s v1.24集群】Chapter 4 通过外部域名访问kubernetes集群服务

Ingress

Ingress是外部访问集群的方式

部署方式

ingress-controller有多种提供方,kubernetes官方推荐ingress-nginx-controller。这里是链接。部署ingress-nginx-controller时,如果采用LoadBalancer,则需要云服务提供商。一般我们都是进行独立的私有化部署,因此默认的LoadBalancer方式部署并不适用

官方提供了多种解决方案,以下部分方案说明,所有方案参考bare metal

  1. 使用NodePort方式部署ingress-nginx-controller。缺点是端口不固定,创建ingress后需要通过xxx.example.com:port的方式进行访问。
  2. 开源LoadBalancer项目MetalLB。解决LoadBalancer必须使用云提供商的痛点,但是一开始是个人项目,目前由个人团队维护,处于beta阶段。

ingress部署镜像下载问题

使用的镜像为google的gcr镜像,国内无法访问。好心人已经在DockerHub上传了这些镜像,可以在DockerHub上搜索ingress-nginx-controller和kube-webhook-certgen,pull下来后push到自己搭建的镜像仓库中,再修改部署yaml文件中的image即可成功部署。

部署MetalLB作为LoadBalancer

准备工作#
首先需要部署好ingress-nginx,然后修改kube-proxy配置

kubectl edit configmap -n kube-system kube-proxy

按照下面设置

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

安装metallb

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.3/config/manifests/metallb-native.yaml

假设外部域名都解析到master节点,则metallb的ip地址池可以配置成固定的master节点的ip(192.168.3.81),按照下面配置创建资源:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: public-ips
  namespace: metallb-system
spec:
  addresses:
  - 192.168.3.81/32

创建好ip地址池后ingress-nginx命名空间下的ingress-nginx-controller会从pending状态变成running状态(如果没有请修改成NodePort再修改成LoadBalancer),并且分配外部endpoints 192.168.3.81:80和192.168.3.81:443。此时创建好ingress就可以通过域名的方式访问集群中的服务。例如:

kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress ing-demo --class=nginx --rule="demo.k8s-app.com/*=demo:80"

注意:通过外部域名访问需要预先在dns服务器(可以使用bind9搭建)中配置好*.k8s-app.com解析到192.168.3.81。此时访问demo.k8s-app.com会显示It works!。

dashboard配置外部域名访问

如果已经部署了ingress,要通过域名访问dashboard,可以按照如下创建ingress,修改其中的host。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/configuration-snippet: |-
      proxy_ssl_server_name on;
      proxy_ssl_name $host;
spec:
  rules:
  - host: dashboard.k8s-app.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

版权声明:本文为Yuriey原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。