一、service:pod是有生命周期的,我们想给客户一个固定的访问端点,在客户端与服务端之间启动一个固定的中间层,依赖于kubernetes的一个附件CoreDns。kubernetes有三类网路地址
1.node network 节点网路,实在存在的,配置在节点接口之上的
2.pod network pod网络,实在存在的,配置在pod资源之上的
3.cluster network 集群地址,虚拟地址,仅出现service的规则当中
service:有三种工作模式
userspace:用户空间,用户请求到达service以后,先把他转为本地监听在某个套接字上的用户空间的kube-proxy,由kube-proxy负责处理。kube-proxy处理完成以后再转给service ip 最终代理至这个service管理的各pod实现调度。效率很低,先到内核空间--->用户空间--->内核空间.是kube-proxy负责调度的
iptables:客户端ip请求时直接请求service ip,请求报文在本地内核空间的service规则截取,进而直接调度给相关的pod。由iptables规则直接负责调度。1.10-之前用
ipvs:客户端ip请求时直接请求service ip,请求报文在本地内核空间的service ipvs截取,进而直接调度给相关的pod。由ipvs规则直接负责调度。1.1.1+用的是ipvs
service的pod资源发生改变,例如标签选择器适用的pod增加。适用的信息会立即反映到api server中,kube-proxy watch到api server中的变化 ,立即转为ipvs的规则。动态实时转换
使用清单创建service资源:
获取service字段信息:kubectl explain service
type格式是clusterIP
apiVersion: v1 kind: Service metadata: name: redis namespace: default spec: selector: app: redis role: logstor clusterIP: 10.97.97.97 type: ClusterIP ports: - port: 6379 targetPort: 6379
type格式是nodeport,可以在集群外访问。通过访问每个节点的ip:nodeport
apiVersion: v1 kind: Service metadata: name: myapp namespace: default spec: selector: app: myapp release: canary clusterIP: 10.98.98.98 #如果将clusterIP设置为None就是无头的service,没有ip地址,但是可以通过名称myapp.defalut.svc.cluster.local.进行访问
sessionAffinity: ClientIP
type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080
红色字体表示设置选择session保持
二、ingress Controller + service(仅用于对pod的分类,service关联的有几个pod,就是upstream后端pod) 实现
ingress基于service分类,识别出有几个pod和pod信息。并且把pod的信息(ip地址)生成配置信息,注入到ingress Controller
k8s还有yi一种引入集群外部流量的方式ingress,ingress资源是一种七层调度器,他利用一种七层pod来实现将外部流量引入到内部来。事实上他也脱离不了service的工作。 作为ingress 用于基于七层调度时,我们必须要用pod中的运行的七层服务功能的mirror调度。可用的解决方案nginx,haproxy等。
nginx
Traefik
Envooy(适用于微服务)
ingress的定义 kubectl explain ingress
安装ingress可以参照 https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
用ingress-nginx代理到后端tomcat
定义后端tomcat的deployment和service
apiVersion: v1 kind: Service metadata: name: tomcat namespace: default spec: selector: app: tomcat release: canary ports: - name: http port: 8080 targetPort: 8080 - name: ajp port: 8009 targetPort: 8009 --- apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deploy namespace: default spec: replicas: 1 selector: matchLabels: app: tomcat release: canary strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: metadata: labels: app: tomcat release: canary spec: containers: - name: tomcat-container image: tomcat:8.5.32-jre8-alpine imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 - name: ajp containerPort: 8009
vim ingress-tomcat.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tomcat namespace: default annotations: kubernetes.io/ingress.clall: "nginx" spec: rules: - host: tomcat.yiruiduan.com http: paths: - path: /tomcat backend: serviceName: tomcat servicePort: 8080
红色部分是想对应的,只有在同一个namespace才能找到后端的tomcat。ingress是通过service确定哪些是他的后端服务器的所以serviceName要和后端的service名称相同
注:根据url路径代理,后端的tomcat必须存在真是的path路径。即tomcat的pod中/usr/local/tomcat/webapps的目录下有tomcat路径,否则会返回404
构建https服务
创建secret对象 kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
查看secret对象 kubectl get secret
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tomcat-tls namespace: default annotations: kubernetes.io/ingress.clall: "nginx" spec: tls: - hosts: - tomcat.yiruiduan.com secretName: tomcat-ingress-secret rules: - host: tomcat.yiruiduan.com http: paths: - path: /tomcat backend: serviceName: tomcat servicePort: 8080 - path: backend: serviceName: tomcat servicePort: 8080
访问测试:https://tomcat.yiruiduan.com:80443