K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

Service存在的意义
pod IP不固定?
增加一个控制器负责动态获取Pod列表IP,动态更新到负载均衡器配置
Pod是多副本?
前面增加一个负载均衡器
为了解决上面两个问题,K8S引入Service。

kubectl create  deployment  nginx  --image=nginx  --dry-run -o yaml  > zf.yaml  
kubectl  apply -f  zf.yaml  #创建pod
kubectl expose  deployment  nginx  --port=80 --target-port=80 --dry-run=client  -o yaml > service.yaml  #创建service yaml

cat serice.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80             #负载均衡器端口
    protocol: TCP        #网络协议
    targetPort: 80       #容器中服务的端口
  selector:              #标签选择器,这里用来关联pod
    app: nginx

负载均衡器四层和7层怎么理解?
四层是指传输层:基于IP+端口转发
七层应用层,基于应用层协议,例如HTTP(域名,cookie,request)

查看关联的Pod

K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

如何查找关联pod的sevice

Kubectl get ep    #模糊查找service
kubectl get pods  -l  app=nginx    #精确查找关联的pod

service三种常用类型

ClusterIp:集群内部使用(默认)
NodePort:对外暴露应用
LoadBalancer:对外暴露应用,适用于公有云

访问pod

K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
#任意节点IP+端口即可访问,没有指定类型默认clusterip,只能内部集群访问
curl 10.104.233.167
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

Nodeport类型

在每个节点上启用一个端口来暴露服务,可以在集群外部访问,也会分配一个稳定内部集群ip地址。 端口范围 : 30000-32767
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

创建nodeport类型svc
vim  service2.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx2
spec:
  type: NodePort         #增加一行指定类型
  ports:
  - port: 80             #负载均衡器端口
    protocol: TCP        #网络协议
    targetPort: 80       #容器中服务的端口
    #nodePort:30001      #可以固定端口
  selector:              #标签选择器,这里用来关联pod
    app: nginx

kubectl get svc #查看svc,可以看到刚才创建的svc,任意节点ip+32608都可以访问
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

LoadBalancer 类型

与nodeport 类型,在每个节点上启用一个端口来暴露鲁夫,除此之外,kubernetes会 请求底层云平台上的负载均衡器,将每个node作为后端添加进去。
#缺点:只支持公有云,因为他们有统一的api访问接口

service代理模式

1.userspace: k8s自带,效率低下
2.iptables : 默认实现的负载均衡
3.ipvs(lvs):
kubectl logs kube-proxy-wkdh4 -n kube-system #查看默认使用iptables代理模块!
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

更改代理模式

kubectl edit configmap kube-proxy -n kube-system
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
所有节点生效的话,需要更改所有节点,然后重建pod

二进制方式

vim kube-proxy-config.yaml
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
kubectl delete pod kube-proxy-wkdh4 -n kube-system #删除后自动拉起
更新过后可以看到ipvs

yum -y install ipvsadm  #安装ipvs
ipvsadm  -L -n    #查看规则

iptables特点:

1.灵活,功能强大
2.规则遍历匹配和更新,呈线性时延

IPVS特点:

1.工作在内核态,有更好的性能
2.调度算法丰富,rr   wrr  lc    wlc,ip hash....

#小规模,iptables够用,大规模pod,用ipvs。

service dns名称

CoreDns:是一个dns服务器,kubernetes默认采用,以pod部署在集群中,coredns服务监视kubernetes api 为每一个service创建dns记录用于域名解析。
工作流程
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

Ingress 为弥补nodeport 不足而生

nodeport 缺点: 
一个端口只能一个服务使用,端口需要提前规划
只支持负载均衡4层协议

Ingress : 公开从集群外部到集群内服务的http和https路由的规则集合,而具体实现流量路由则是由Ingress负责
Ingress k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
Ingress Controller 根据ingress生成具体的路由规则,并对pod负载均衡器
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。
项目地址:https://github.com/kubernetes/ingress-nginx

1.0创建ingress controller

#准备好service已经暴露的应用,我这里之前已经创建一个nginx pod作为示例

kubectl create deploy  web  --image=nginx
kubectl expose  deploy  web  --port=80  --target-port=80 --type=NodePort
1.1下载ingress controller
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-
0.30.0/deploy/static/mandatory.yaml
#  wget  http://120.78.77.38/file/ingress-controller.yaml

修改YAML:
• 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.30.0
• 将Ingress Controller暴露,一般使用宿主机网络(hostNetwork: true)或者使用NodePort

#启动 ingress controller

kubectl  apply -f  ingress-controller.yaml

#检擦

kubectl get pods  -n  ingress-nginx

K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

2.0 编写ingress控制器域

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zhangfan
spec:
  rules:
  - host: www.zhangfan.com         #域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web               #svc名称
            port:
              number: 80            #端口

K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
可以看到ingress控制器在cka-node节点上

3.0 测试ingress控制器

本地hosts添加一个域名解析

192.168.106.201       www.zhangfan.com

K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
最终实现了如图的架构 使用域名80端口访问到pod
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试

4.0 测试https

1、准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
2、将证书文件保存到Secret

kubectl  create secret tls www.zhangfan.com  \
--cert=www.zhangfan.com.pem  \
--key=www.zhangfan.com-key.pem

3、Ingress规则配置tls

cat  ingress-https.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: www.zhangfan.com
spec:
  tls:
  - hosts:
      - web.aliangedu.cn           #域名
    secretName: www.zhangfan.com   #Secret创建时的名字  
  rules:
  - host: www.zhangfan.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 80

kubectl apply -f ingress-https.yaml #生成证书
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
K8S入门学习笔记第七天,service意义,service类型,svc代理模式,Ingress域名访问测试
再次访问该域名自动跳转到https www.zhangfan.com

上一篇:入门级实操教程!从概念到部署,全方位了解K8S Ingress!


下一篇:通过helm部署EFK收集应用日志,ingress-nginx日志解析。