目录
一、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 的连接。
在容器内无法访问
成功访问