K8s service--ingress

目录

一、Ingress介绍

二、Ingress的部署

三、添加域名访问ingress

单域名服务

多域名多服务 

​Ingress nginx加密部署 

​Ingress 认证配置 

金丝雀发布(流量的切换)


一、Ingress介绍

一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,就是 Kubernetes 里的Ingress 服务。

Ingress由两部分组成:Ingress controller和Ingress服务。

Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller

二、Ingress的部署

mkdir ingress
cd ingress/
ls
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/baremetal/deploy.yaml #下载定义文件
ls
vim deploy.yaml #修改镜像的路径
kubectl apply -f deploy.yaml
kubectl get ns #应用后会创建一个名为ingress-nginx 的namespace
kubectl get pod -n ingress-nginx #查看pod状态
kubectl  -n ingress-nginx get all #可以看出ingress-controller已经正常运行

拉取上传镜像到本地仓库

kubectl get svc
kubectl delete svc lb-nginx
cd
cd pod/
kubectl get pod
 ls
vim deploy.yml
kubectl get pod --show-labels
kubectl apply -f deploy.yml
kubectl get svc #创建一个名为myservice的服务使用默认方式ClusterIP
kubectl describe svc myservice ##有endpoint
curl 10.106.65.81 #可以访问
kubectl get svc -n ingress-nginx
kubectl edit svc ingress-nginx-controller -n ingress-nginx #修改type:LoadBalancer
kubectl get svc -n ingress-nginx #Pod 的 IP地址配置给负载均衡服务做后端。
kubectl -n ingress-nginx describe svc ingress-nginx-controller
kubectl -n ingress-nginx get pod -o wide

三、添加域名访问ingress

单域名服务

在宿主机添加解析

cd
cd ingress/
ls
vim ingress.yaml
kubectl get svc
kubectl get ingressclasses.networking.k8s.io
kubectl apply -f ingress.yaml #创建ingress服务并将myservice添加为后端服务
kubectl describe ingress ingress-demo
kubectl -n ingress-nginx get pod ##ingress集群已经部署成功,可以使用以下命令查看ingress服务
kubectl -n ingress-nginx exec -it ingress-nginx-controller-58d78dc857-2cd2z -- bash #进入控制器查看添加的解析动态生效

外部测试访问成功

多域名多服务 

kubectl get all
cd
cd pod/
ls
cp deploy.yml deploy-2.yml
vim deploy-2.yml # 再添加一个服务
kubectl apply -f deploy-2.yml
kubectl describe get svc myapp-svc #查看添加成功
kubectl describe svc myapp-svc

 cd ingress/
 ls
 vim ingress.yaml #设置www2.westos.org
kubectl apply -f ingress.yaml
kubectl get ingress
kubectl describe ingress ingress-demo #当用户访问www2.westos.org时调度到版本为myapp-svc的pod
kubectl -n ingress-nginx exec -it ingress-nginx-controller-58d78dc857-2cd2z -- bash

可以成功访问,查看负载均衡情况 

Ingress nginx加密部署 

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc" # 生成tls密钥和证书
ls
ll tls.key
ll tls.crt
kubectl create secret tls tls-secret --key tls.key --cert tls.crt #将生成的证书和key保存到secret里面
kubectl get secrets #查看secrets
kubectl describe secrets tls-secret #查看详细信息

Ingress 认证配置 

vim ingress.yaml
kubectl apply -f ingress.yaml #应用部署文件
kubectl describe ingress ingress-demo 查看服务状态,可以看出已经有了tls加密

当部署了加密后,默认访问80端口会被重定向到443端口
yum install -y httpd-tools #安装所需软件
htpasswd -c auth admin  #创建认证用户
ls
cat auth 查看生成的认证文件
kubectl create secret generic basic-auth --from-file=auth
kubectl get secret

此时可以在浏览器输入www1.westos.org 测试访问: 

可以看出输入地址自动被重定向到443端口,选择高级 -->接受: 

编辑部署文件 

vim ingress.yaml
kubectl apply -f ingress.yaml
kubectl describe ingress ingress-demo #查看已经加入

 在浏览器中可以访问,需要认证密码

vim ingress.yaml #编辑部署文件

我们要求重写的策略是:访问www1.westos.org时重写到www1.westos.org/hostname.html

kubectl apply -f ingress.yaml
kubectl describe ingress ingress-demo #查看已经加入 

测试访问: 

 金丝雀发布(流量的切换)

 kubectl get svc
kubectl delete svc myservice
cd pod/
ls
vim deploy.yml #更改name
kubectl apply -f deploy.yml
kubectl get svc
curl 10.107.109.238
kubectl delete svc myapp-svc
ls
vim deploy-2.yml
kubectl apply -f deploy-2.yml
kubectl get svc
cd
cd ingress/
ls
kubectl get svc
kubectl get ingress
kubectl delete ingress ingress-demo #清除实验环境
kubectl get ingress

在宿主机中添加解析

cp ingress.yaml v1-ingress.yaml
vim v1-ingress.yaml #修改版本v1
kubectl apply -f v1-ingress.yaml #应用
kubectl get ingress
kubectl describe ingress ingress-myapp
cp v1-ingress.yaml v2-ingress.yaml
vim  v2-ingress.yaml #设置让v1的流量以一定的权重转移到v2上,设置权重为10
kubectl apply -f v2-ingress.yaml
kubectl get ingress
kubectl describe ingress ingress-myapp-canary 

编写脚本执行curl -s myapp.westos.org并过滤出出现v1.v2的次数

执行脚本,可以看到v1流量切换为90,v2为10

vim  v2-ingress.yaml #修改权重
kubectl apply -f v2-ingress.yaml
kubectl describe ingress ingress-myapp-canary

测试成功:

vim  v2-ingress.yaml #修改权重
kubectl apply -f v2-ingress.yaml
kubectl describe ingress ingress-myapp-canary  

vim  v2-ingress.yaml #修改权重
kubectl apply -f v2-ingress.yaml
kubectl describe ingress ingress-myapp-canary  

calico网络插件

 

 Felix:监听ECTD中心的存储获取事件,用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。 

 BIRD:一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,路由的时候到这里来。

IPIP工作模式:适用于互相访问的pod不在同一个网段中,跨网段访问的场景。 

BGP工作模式:适用于互相访问的pod在同一个网段,适用于大型网络。

NetworkPolicy策略模型:控制某个namespace下的pod的网络出入站规则

 查看使用的flannel插件

mkdir calico
cd calico/
ls
curl https://docs.projectcalico.org/manifests/calico.yaml -o calico.yml
ls
vim calico.yml ##修改镜像的路径

 在server1上拉取所需的镜像上传到本地仓库

上传到本地仓库

kubectl delete -f kube-flannel.yml
kubectl get pod -n kube-system
cd /etc/cni/
ls
cd net.d/
ls
rm -f 10-flannel.conflist #每个节点都要删除。要不然会对网络插件有影响,下次创建会自动生成

cd calico/
ls
kubectl apply -f calico.yml #部署创建
kubectl get pod -n kube-system #等待全部就绪
kubectl get all -n kube-system

kubectl get pod -n kube-system
cd /etc/cni/net.d/
ls #这时已经变成calicoc网络,但是外部不能访问
cd
 ls
cd ingress/
ls
kubectl delete -f v1-ingress.yaml #删除之前的部署文件
kubectl delete -f v2-ingress.yaml
kubectl get ingress
kubectl get pod
kubectl delete svc --all
kubectl get svc
kubectl delete deployments.apps deployment-myapp
kubectl delete deployments.apps deployment-nginx

kubectl get pod
kubectl get svc
cd
ls
cd pod/
ls
kubectl apply -f deploy.yml
kubectl get pod -o wide
kubectl get svc
curl 10.110.44.239 #集群内可以访问
curl 10.110.44.239/hostname.html
cd
cd ingress/
ls
cat v1-ingress.yaml
kubectl apply -f v1-ingress.yaml #创建服务可以通过外部访问

外部访问成功 :

限制访问指定服务

kubectl describe ingress ingress-myapp
kubectl get pod --show-labels #显示标签
cd
cd calico/
ls
 vim policy.yaml #编写nginx限制服务文件
kubectl apply -f policy.yaml
kubectl get networkpolicies.networking.k8s.io
kubectl  get pod -o wide
curl 10.244.141.194 #访问不了,因为没有匹配的标签
kubectl run demo -it  --image=busyboxplus #运行容器

podSelector:每个 NetworkPolicy 都包括一个 podSelector,它对该策略所 适用的一组 Pod 通过labels进行选择。示例中的策略选择带有 "access=true" 标签的 Pod。 空的 podSelector 选择名字空间下的所有 Pod。

重新打开一个终端 :查看标签

 kubectl get pod --show-labels
kubectl label pod demo access=true #添加标签
kubectl get pod --show-labels

在容器内访问成功实现负载均衡

cd calico/
ls
vim policy.yaml
kubectl apply -f policy.yaml
kubectl describe networkpolicies. access-nginx
kubectl create namespace test #创建ns
kubectl get ns --show-labels #还没有符合要求的标签
kubectl -n test get pod
kubectl -n test get pod --show-labels
kubectl get ns --show-labels
kubectl label ns test role=test #加入标签
kubectl get ns --show-labels

namespaceSelector:此选择器将选择特定的名字空间,应将所有 Pod 用作其 入站流量来源或出站流量目的地 

from 数组中包含两个元素,允许来自本地名字空间中标有 access=true的 Pod 的连接, 来自任何名字空间中标有 role=test 的任何 Pod 的连接。

在容器内无法访问

成功访问

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值