网站登记备案,jsp企业网站开发前期报告,宁波网站建设公司比较好,网站推广与优化哪里好Service服务发现的必要性:
对于kubernetes整个集群来说#xff0c;Pod的地址也可变的#xff0c;也就是说如果一个Pod因为某些原因退出了#xff0c;而由于其设置了副本数replicas大于1#xff0c;那么该Pod就会在集群的任意节点重新启动#xff0c;这个重新启动的Pod的I…Service服务发现的必要性:
对于kubernetes整个集群来说Pod的地址也可变的也就是说如果一个Pod因为某些原因退出了而由于其设置了副本数replicas大于1那么该Pod就会在集群的任意节点重新启动这个重新启动的Pod的IP地址与原IP地址不同这对于业务来说就不能根据Pod的IP作为业务调度。kubernetes就引入了Service的概念它为Pod提供一个入口主要通过Labels标签来选择后端Pod这时候不论后端Pod的IP地址如何变更只要Pod的Labels标签没变那么 业务通过service调度就不会存在问题。
当声明Service的时候会自动生成一个cluster IP这个IP是虚拟IP。我们就可以通过这个IP来访问后端的Pod当然如果集群配置了DNS服务比如现在的CoreDNS那么也可以通过Service的名字来访问它会通过DNS自动解析Service的IP地址。
Service的模式有三种user spaceiptablesipvs: 1、userspace模式 客户端请求到内核空间后由iptables规则将其转发到用户空间的 kube-proxykube-proxy 将其调度到各个node上的目标Pod。这种模式需要多次切换用户空间和内核空间性能很差生产环境不再使用。 2、iptables模式 iptables模式中客户端的请求进入内核态后直接由iptables将请求转发到各个pod上这种模式中随着iptables规则的增加性能越来越差而且iptables规则查看和管理难度很大生产环境中尽量少用。 3、ipvs模式 ipvs模式中客户端的请求进入内核态后直接由ipvs规则将请求转发到各个pod上这种模式相当于内嵌一套lvs集群性能比iptables强大更重要的是支持lvs中调度算法生产环境中ipvs模式优先考虑使用。ipvs内部时使用ipset维护映射关系由于是hash链表因此查询速度远远大于iptables的遍历速度。 Service的类型有四种:Cluster IPLoadBalanceNodePortExternalName
其中Cluster IP是默认的类型。 1、Cluster IP通过 集群内部IP暴露服务默认是这个类型选择该值这个Service服务只能通过集群内部访问 2、LoadBalance使用云提供商的负载均衡器可以向外部暴露服务选择该值外部的负载均衡器可以路由到NodePort服务和Cluster IP服务 3、NodePort顾名思义是Node基本的Port如果选择该值这个Service可以通过NodeIP:NodePort访问这个Service服务NodePort会路由到Cluster IP服务这个Cluster IP会通过请求自动创建 4、ExternalName通过返回 CNAME 和它的值可以将服务映射到 externalName 字段的内容没有任何类型代理被创建可以用于访问集群内其他没有Labels的Pod也可以访问其他NameSpace里的Service。
今天我主要介绍两种类型的用法Cluster IP和NodePort
开始实验
代码我还是用上个实验的tomcatmysql项目zrlog
mysql的service用Cluster IP类型因为mysql只通过集群内部访问也可以了
tomcat的service用NodePort类型因为tomcat要和mysq通信也要和外部通信
k8s集群的安装这里就不讲了 前面的文章有详细的写了没装好的可以去看看
首先配置好系统环境
[rootserver153 test]# modprobe ip_va
[rootserver153 test]# echo ip_vs /etc/modules-load.d/k8s.conf然后创建一个空目录
开始编写yaml文件如果不想手写那么多代码的可以生成一个模板我上一篇文章也有介绍了
tomcat和mysql的代码其实也可以写在一个文件里,用—分开就可以了但是那样太长了所以我分两个文件写
先写tomcat的yaml文件
[rootserver153 test]# cat tomcat-deploy.yaml
apiVersion: v1
kind: Service # 声明版本为Service
metadata:name: tomcat-service # 定义Service的名字labels:name: show-tomcat-pod # 定义Service的标签
spec:type: NodePort # 定义Service的类型,自动分配一个集群serviceipselector:app: tomcat-deploy #定义标签选择器,会代理后端apptomcat-deploy的Podports:- port: 80 #内部暴露的端口 targetPort: 8080 #代理的pod的端口 nodePort: 31111 #暴露给主机外部访问的端口(default: 30000-32767)---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: tomcat-deployname: tomcat-deploynamespace: default
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: tomcat-deploystrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: tomcat-deployspec:#创建init容器initContainers:#代码镜像- image: www.test.com/mytest/zrlog:v1#init容器名字name: init#将代码复制到匿名数据卷command: [cp,-r,/tmp/ROOT.war,/www]#将匿名数据卷挂载到容器中的/www目录下volumeMounts:- mountPath: /wwwname: tomcat-volume#创建tomcat容器containers:- image: oxnme/tomcatimagePullPolicy: Alwaysname: tomcatterminationMessagePath: /dev/termination-logterminationMessagePolicy: File#将数据卷挂载到tomcat的代码目录下volumeMounts:- mountPath: /usr/local/tomcat/webapps/name: tomcat-volumednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerterminationGracePeriodSeconds: 10#创建匿名数据卷volumes:- name: tomcat-volumeemptyDir: {}然后是mysql的yaml文件有些是一样的字段所以我就不写注释了
本来mysql这种有状态的pod应该用StatefulSet控制器的但是现在主要是实验service
所以我就用简单的pod来代替了
[rootserver153 test]# cat mysql-pod.yaml
apiVersion: v1
kind: Service
metadata:name: mysql-headless-servicelabels:name: svc-mysql-pod
spec:type: ClusterIPselector:run: mysql-podports:- port: 3306 #内部的暴露端口targetPort: 3306 #代理的pod的端口这里不用暴露给外部网络访问所以不用写nodePort了---
apiVersion: v1
kind: Pod
metadata:labels:run: mysql-podname: mysql-podnamespace: default
spec:containers:- image: mysql:5.7imagePullPolicy: IfNotPresentname: mysql-podresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:env:- name: MYSQL_ROOT_PASSWORD #定义mysql的初始密码value: MySQL666- name: MYSQL_DATABASE #初始化是创建一个zrlog数据库value: ZrlogdnsPolicy: ClusterFirstenableServiceLinks: truepreemptionPolicy: PreemptLowerPriorityrestartPolicy: AlwaysschedulerName: default-schedulerserviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30
配置文件写好以后就可以启动服务了
[rootserver153 test]# kubectl apply -f mysql-pod.yaml
service/mysql-headless-service created
pod/mysql-pod created
[rootserver153 test]# kubectl apply -f tomcat-deploy.yaml
service/tomcat-service created
deployment.apps/tomcat-deploy created看运行结果可以看到service和pod都被创建了然后去查看pod和service的情况
[rootserver153 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-pod 1/1 Running 0 104s
tomcat-deploy-555479bdf4-bj7mt 1/1 Running 0 96s
[rootserver153 test]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 none 443/TCP 4d3h
mysql-headless-service ClusterIP 10.1.50.178 none 3306/TCP 2m13s
tomcat-service NodePort 10.1.7.229 none 80:31111/TCP 2m5s可以看到情况是正常的
然后我们去看service的详细情况
[rootserver153 ~]# kubectl describe services然后我们去浏览器访问刚才我们定义的外部端口31111 可以看到是能访问的不需要像上次那样又查看变化的ip又要nginx代理才能访问了
就像docker端口映射一样现在就可以通过端口访问了
然后我们连接数据库安装 然后我们的service实验就完成了
pod之间的访问通过名称和端口就可以了service是通过标签名来自动发现的所以ip再怎么变也没有关系
这就解决了pod重建ip会变的问题了
希望对大家的学习有帮助