ingress概念:
通俗来讲:ingress和之前说的service、deployment一样,也是一个k8s的资源类型;ingress用于实现域名的方式访问k8s的内部应用,service可能更适于服务间访问。
这东西我们使用的k8s官方维护的本版,另外nginx官方也有一个版本,怎么用看个人。
ingress支持多种方案:包括 nginx、haproxy、traefik、istio等;在实际中ingress上面可能还有一层公司的硬件层代理。
大概的流程图如下:
创建一个ingress:
这个ingress使用hlem方式创建,以后会写一篇helm的使用,现在不用管原理。
所需资源准备:
ingress-nginx使用的两个容器镜像下载地址:
镜像地址:registry.cn-hangzhou.aliyuncs.com
镜像:yyangs/ingress-nginx-controller;yyangs/ingress-nginx-kube-webhook-certgen
chart包:ingress-nginx-4.0.17
首先我们先创建一个helm(因为要使用helm创建)
[root@k8s-master01 ~]# wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz [root@k8s-master01 ~]# tar xf helm-v3.8.0-linux-amd64.tar.gz [root@k8s-master01 ~]# mv linux-amd64/helm /usr/local/bin/helm
创建一个仓库 ,方便安装ingress:ingress的app version版本最好要大于0.35,查看其下可用的包
[root@k8s-master01 ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx "ingress-nginx" has been added to your repositories [root@k8s-master01 ~]# helm repo list name url ingress-nginx https://kubernetes.github.io/ingress-nginx [root@k8s-master01 ~]# helm search repo ingress-nginx name chart version app version description ingress-nginx/ingress-nginx 4.0.17 1.1.1 ingress controller for kubernetes using nginx a...
下载ingress包,将包解压到一个创建的目录中方便修改配置
[root@k8s-master01 ~]# helm pull ingress-nginx/ingress-nginx ingress-nginx-4.0.17.tgz [root@k8s-master01 ~]# mkdir /temp [root@k8s-master01 ~]# mv ingress-nginx-4.0.17.tgz /temp/ [root@k8s-master01 ~]# cd /temp/ [root@k8s-master01 temp]# tar xf ingress-nginx-4.0.17.tgz # 进到ingress-nginx目录 [root@k8s-master01 temp]# cd ingress-nginx/
修改values.yaml,基本每一行都代表一个位置
# 源位置 controller: name: controller image: registry: registry.cn-hangzhou.aliyuncs.com image: yyangs/ingress-nginx-controller ## digest: sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de # dns策略 dnspolicy: clusterfirstwithhostnet # 使用宿主机端口号,性能好 hostnetwork: true # 资源类型选择daemonset,会在指定节点上部署 kind: daemonset # 在有标签的node上部署 nodeselector: kubernetes.io/os: linux ingress: "true" # 类型,本地环境使用 type: clusterip # 最后位置的另一处源位置 patch: enabled: true image: registry: registry.cn-hangzhou.aliyuncs.com image: yyangs/ingress-nginx-kube-webhook-certgen ## digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
对上面的修改做一些说明:
镜像源:他默认源是国外的,我们访问不到。所以我替换成了我的阿里源,如果做这个实验的小伙伴可以用我的源;最后一处的源也一样;注意把校验注释
使用hostnetwork: true创建,配合资源类型选择daemonset性能更好
dns策略:如果使用hostnetwork,策略需要改成dnspolicy: clusterfirstwithhostnet
执行yaml文件创建
# 创建一个命名空间 [root@k8s-master01 ingress-nginx]# kubectl create ns ingress-nginx namespace/ingress-nginx created # 因为要在指定node上创建,所以给一台机器创建一个标签 [root@k8s-master01 ingress-nginx]# kubectl label nodes k8s-master03 ingress=true node/k8s-master03 labeled # 执行helm创建,那个名称自定义,之前出了一点问题,所以换个名字。 [root@k8s-master01 ~]# cd /temp/ingress-nginx/ 您在 /var/spool/mail/root 中有新邮件 [root@k8s-master01 ingress-nginx]# helm install nginx-ingress -n ingress-nginx . [root@k8s-master01 temp]# kubectl get pod -n ingress-nginx -o wide name ready status restarts age ip node nominated node readiness gates nginx-ingress-ingress-nginx-controller-lrs9s 1/1 running 0 22h 192.168.10.4 k8s-master03 <none> <none>
可以看到这个pod已经起来了,并且部署在master03节点上,也就是有ingress=ture
标签的节点上,这样对ingress进行扩容或缩容的时候就会方便很多。
比如当你想扩容的时候只需要在想扩容的节点打上对应的标签,就会自动部署一个新的pod,就像下面这条命令。
kubectl label node k8s-master02 ingress=true
当我不想要这个pod的时候,缩容也会比较简单,去掉标签就可以了,可以看出标签的强大之处,减号等于删除标签的意思。
kubectl label node k8s-master02 ingress-
hostnetwork方式部署的ingress,会在宿主机启动一个进程,我们去部署pod的节点看一下,
[root@k8s-master03 ~]# ss -tpln | grep 80 listen 0 16384 192.168.10.4:2380 *:* users:(("etcd",pid=1703,fd=7)) listen 0 16384 *:80 *:* users:(("nginx",pid=106434,fd=19),("nginx",pid=106427,fd=19)) listen 0 16384 *:80 *:* users:(("nginx",pid=106433,fd=11),("nginx",pid=106427,fd=11)) listen 0 16384 [::]:80 [::]:* users:(("nginx",pid=106433,fd=12),("nginx",pid=106427,fd=12)) listen 0 16384 [::]:80 [::]:* users:(("nginx",pid=106434,fd=20),("nginx",pid=106427,fd=20)) [root@k8s-master03 ~]# ps aux | grep nginx root 2622 0.0 0.1 8852 5456 ? ss 01:12 0:00 nginx: master process nginx -g daemon off; 101 2759 0.0 0.0 9272 2456 ? s 01:12 0:00 nginx: worker process 101 2760 0.0 0.0 9272 2456 ? s 01:12 0:00 nginx: worker process root 25605 0.0 0.0 112840 2292 pts/0 s+ 15:19 0:00 grep --color=auto nginx 101 106347 0.0 0.0 208 4 ? ss 09:08 0:00 /usr/bin/dumb-init -- /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key 101 106359 0.1 1.1 743048 44956 ? ssl 09:08 0:25 /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key 101 106427 0.0 0.9 145100 36332 ? s 09:08 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf 101 106433 0.0 1.0 157128 40848 ? sl 09:08 0:06 nginx: worker process 101 106434 0.0 1.0 157128 41000 ? sl 09:08 0:07 nginx: worker process 101 106435 0.0 0.7 143072 29120 ? s 09:08 0:00 nginx: cache manager process
运行之后,接下来尝试简单的使用:
传统架构中发布服务,需要配置修改nginx的配置文件;在k8s中ingress与其他资源类型一样,通过yaml去声明一个ingress的实例。
官方网址:ingress-controller官方文档详细内容可以看这。
使用官网上一个例子先认识一下ingress
vim ingress.yaml
apiversion: networking.k8s.io/v1 kind: ingress metadata: annotations: name: example spec: ingressclassname: nginx rules: # 可以配置多个rules - host: foo.bar.com # 域名匹配 http: paths: # 相当于nginx的location配合,同一个host可以配置多个paths - path: / pathtype: prefix backend: service: name: nginx-svc # 代理的哪个svc port: number: 80
这里说一下上面这个实例的一些说明:
从rules开始向下是定义前后端连接的规则:
host
:代表基于域名访问,客户端通过这个域名访问后端资源
http.paths
:相当于nginx的location中匹配规则
pathtype:prefix
:路径类型,路径由“/”符号分隔为一个个元素,匹配规则为逐个元素进行前缀匹配,默认implementationspecific,还有一种是exact。
backend
:定义后端
service
:下定义后端的地址,包括代理的svc和端口号
这里我遇到一个问题:
[root@k8s-master01 ~]# kubectl create -f ingress.yaml error from server (internalerror): error when creating "ingress.yaml": internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": service "ingress-nginx-controller-admission" not found
创建的时候报错:
yaml”: internal error occurred: failed calling webhook “validate.nginx.ingress.kubernetes. io”
我查看了下网上说应该是删除之前创建的资源时没删干净。
[root@k8s-master01 ~]# kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io name webhooks age ingress-nginx-admission 1 3d
然后查看下果然有个ingress-nginx-admission
,删除后在创建就成功了
[root@k8s-master01 ~]# kubectl delete -a validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted
执行ingress.yaml文件,这次就创建成功了。
[root@k8s-master01 ~]# kubectl create -f ingress.yaml ingress.networking.k8s.io/exmple created [root@k8s-master01 ~]# kubectl get ingress name class hosts address ports age exmple <none> foo.bar.com 80 10m
ingress也是可以配置多域名的
就是增加一个host实例。
# 第一个域名 - host: foo.bar.com http: paths: - path: / pathtype: prefix backend: service: name: nginx-svc port: number: 80 # 第二个域名 - host: foo2.bar.com http: paths: - path: /test pathtype: prefix backend: service: name: nginx-svc-2 port: number: 80
然后更新yaml文件就好了
[root@k8s-master01 ~]# kubectl replace -f ingress.yaml
以上就是ingress七层路由机制实现域名的方式访问k8s的详细内容,更多关于ingress七层路由机制域名访问k8s的资料请关注其它相关文章!