K8s service服务详解
service服务
·
目录
一 service定义
在k8s中,pod是应用程序的载体,我们可以通过pod的IP来访问应用程序,但是pod的ip是不固定,这也就意味着不方便。
为了解决这个问题,k8s提供了service资源服务,service会对同一个服务的多个pod进行聚合,并提供一个入口地址,通过访问service的入口地址就能访问到后面的pod服务。
1.1 ipvs模式
kube-proxy监控pod的变化并创建对应的ipvs规则,ipvs转发效率更高,除此之外,ipvs支持更多的lb算法
##此模式必须安装ipvs内核,否则会被降级为iptables #开启ipvs //1.查看是否生效了ipvs [root@master ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn ##未生效 没有地址 //2.开启ipvs [root@master ~]# kubectl edit cm kube-proxy -n kube-system configmap/kube-proxy edited ##搜索mode关键字,改为ipvs [root@master ~]# kubectl delete pod -l k8s-app=kube-proxy -n kube-system pod "kube-proxy-6qf2n" deleted pod "kube-proxy-nvhd9" deleted pod "kube-proxy-xwsth" deleted ##删除创建的pod 此步生产环境谨慎 //3.查看 [root@master ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.17.0.1:32723 rr TCP 192.168.1.105:32723 rr TCP 10.96.0.1:443 rr -> 192.168.1.105:6443 Masq 1 0 0 TCP 10.96.0.10:53 rr
二 service资源清单
三 service服务实验
3.1 实验环境准备
##准备pod文件 [root@master ~]# cat deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: dp namespace: dev labels: version: v1 spec: replicas: 3 selector: matchLabels: app: nginxpod template: metadata: labels: app: nginxpod spec: containers: - name: nginx image: nginx:1 ports: - containerPort: 80
创建容器
[root@master ~]# kubectl create -f deploy.yaml deployment.apps/dp created 进入容器将nginx的主页文件修改为自己的地址 [root@master ~]# kubectl exec -it dp-644b648b9-m6tsb -n dev /bin/bash root@dp-644b648b9-m6tsb:/# echo "$(hostname -i)" > /usr/share/nginx/html/index.html root@dp-644b648b9-m6tsb:/# exit
3.2 cluster ip类型
[root@master ~]# cat cluster.yaml apiVersion: v1 kind: Service metadata: name: svc namespace: dev labels: service: v1 spec: selector: app: nginxpod type: ClusterIP ports: - port: 80 ##service端口 targetPort: 80 ##pod端口
##创建service [root@master ~]# kubectl create -f cluster.yaml service/svc created ##查看实验效果 默认的策略是轮询调度 [root@master ~]# curl 10.111.237.142 10.244.1.76 [root@master ~]# curl 10.111.237.142 10.244.2.82 [root@master ~]# kubectl get svc -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc ClusterIP 10.111.237.142 <none> 80/TCP 2m46s [root@master ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.111.237.142:80 rr -> 10.244.1.76:80 Masq 1 0 0 -> 10.244.1.77:80 Masq 1 0 0 -> 10.244.2.82:80 Masq 1 0 0 ##查看规则可以发现已经帮我建立一个转发
3.3 nodeip类型
实际环境中,pod是要暴露给外部环境去使用的,nodeip可以做到访问
[root@master ~]# cat cluster.yaml apiVersion: v1 kind: Service metadata: name: svc namespace: dev labels: service: v1 spec: selector: app: nginxpod type: NodePort ports: - port: 80 ##service端口 nodePort: 30002 #指定绑定node的端口 不指定随机分配 targetPort: 80 ##pod端口
//创建service
[root@master ~]# kubectl create -f cluster.yaml
\service/svc created
//查看端口
[root@master ~]# kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc NodePort 10.109.190.33 <none> 80:30002/TCP 33s
//通过访问本机IP 加上30002端口即可
四 ingress
ingree主要功能是通过域名到service,可以解决前面nodeport端口不够用问题,其主要的原理是,在ingress建立映射规则
需要科学上网没做
更多推荐
已为社区贡献3条内容
所有评论(0)