【从零开始搭建k8s v1.24集群】Chapter 4 通过外部域名访问kubernetes集群服务
部署Ingress
Ingress
Ingress是外部访问集群的方式
部署方式
ingress-controller有多种提供方,kubernetes官方推荐ingress-nginx-controller。这里是链接。部署ingress-nginx-controller时,如果采用LoadBalancer,则需要云服务提供商。一般我们都是进行独立的私有化部署,因此默认的LoadBalancer方式部署并不适用
官方提供了多种解决方案,以下部分方案说明,所有方案参考bare metal
- 使用NodePort方式部署ingress-nginx-controller。缺点是端口不固定,创建ingress后需要通过xxx.example.com:port的方式进行访问。
- 开源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
更多推荐
所有评论(0)