企业实战-Kubernetes(四)service

1.Service

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。
service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
service的类型:

  • ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
  • NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
  • LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负
    载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。
  • ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过
    spec.externlName 设定)。

2IPVS模式的Service实现

安装并查看ipvs模块

yum install -y ipvsadm
lsmod |grep ip_vs

在这里插入图片描述

在这里插入图片描述
编辑ipvs模式到k8s配置中并应用

[root@server2 pod]# kubectl -n kube-system edit cm kube-proxy
 mode: "ipvs"
[root@server2 pod]# kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述

[root@server2 pod]# vim deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@server2 pod]# kubectl apply -f deployment.yaml 

[root@server2 pod]# vim svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: myapp:v1
[root@server2 pod]# kubectl apply -f svc.yaml 

在这里插入图片描述
查看后端IP: Endpoints

[root@server2 pod]# kubectl  describe  svc mysvc 

在这里插入图片描述
多次访问,发现实现负载均衡

[root@server2 pod]# curl 10.109.170.62/hostname.html

在这里插入图片描述

在这里插入图片描述

3Service实现外部访问

NodePort方式

NodePort配置mysvc,可让外网进行访问
编辑mysvc 的svc配置文件,将type改为NodePort

编辑mysvc的svc配置文件
kubectl edit svc mysvc

查看svc修改信息
kubectl get svc

在控制端与node端都暴露出32285端口
在这里插入图片描述
请添加图片描述

外部直接访问端口即可,且发现实现负载均衡

请添加图片描述

进入容器内查看策略

kubectl run demo -it --image=busyboxplus --restart=Never
nslookup mysvc

在这里插入图片描述

查看svc的endpoint

kubectl -n kube-system describe svc kube-dns

在这里插入图片描述
解析的endpoint正是服务所在节点

kubectl -n kube-system get pod -o wide

在这里插入图片描述

Headless无头模式

外部访问,可直接访问服务名称

vim headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
      app: myapp
  clusterIP: None

在这里插入图片描述

拉起容器,查看svc信息

kubectl apply -f headless.yaml
kubectl get svc

在这里插入图片描述
进入容器终端查看解析,也可直接访问服务名

kubectl run demo --image=busyboxplus -it --restart=Never
nslookup nginx-svc

在这里插入图片描述

安装dig插件,查看解析的A记录

yum install -y bind-utils
dig -t -A nginx-svc.default.svc.cluster.local. @10.96.0.10

在这里插入图片描述

metallb结合LoadBalancer

通过指定负载均衡的service直接给定IP来对外访问。
创建项目metallb,将metallb镜像压入harbor仓库中。

修改kube-proxy的配置

[root@server2 pod]# kubectl edit configmap -n kube-system kube-proxy
      strictARP: true

修改完成后,删除副本,副本自动创建,重新生成副本使得修改生效

kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述

创建操作目录并进入

mkdir metallb
cd metallb/

vim metallb.yaml 注意镜像名称

在这里插入图片描述
编辑配置文件,给定IP,给定执行权限

vim configmap.yaml
chmod 755 configmap.yaml

在这里插入图片描述

应用metallb.yaml文件,查看ns节点是否健康

kubectl apply -f metallb.yaml
kubectl get ns

在这里插入图片描述

查看metallb-system节点

kubectl -n metallb-system get all
kubectl -n metallb-system get pod

在这里插入图片描述
自动生成secrets memberlist并查看

kubectl -n metallb-system get secrets

在这里插入图片描述

执行configmap.yaml
查看到cm中的配置信息已读取

kubectl apply -f configmap.yaml
kubectl get cm -n metallb-system

在这里插入图片描述
创建一个svc用于测试

vim lb-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: lb-svc
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: myapp
  type: LoadBalancer

删除之前的svc
在这里插入图片描述
执行lb-svc.yaml并查看svc状态
可以看到分配到了 172.25.14.10 处于前面定义的10-20之间

kubectl apply -f lb-svc.yaml
kubectl get svc

在这里插入图片描述
集群外部访问分配的IP实现负载均衡

在这里插入图片描述
ipvsadm -ln看到负载均衡也已加入进来

在这里插入图片描述

ExternalIP

需要外部添加IP到网卡中才可生效!
将前面实验的lb-svc删掉!!
在这里插入图片描述

[root@server2 metallb]# vim ext-ip.yaml 
apiVersion: v1
kind: Service
metadata:
  name: ex-service
spec:
  selector:
    app: myapp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  externalIPs:
  - 172.25.14.100

请添加图片描述

应用并查看svc

在这里插入图片描述

查看当前配置,发现ip172.25.14.100已经出现

ipvsadm -ln

在这里插入图片描述

此时在真机上访问172.25.14.100发现不能访问
原因是server3或server4上没有这个ip,需要我们手动为server3和server4添加

ip addr add 172.25.0.100/24 dev eth0

再次访问,显示成功
在这里插入图片描述

Externalname

通过给定域名访问解析

vim ex-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: www.westos.org

执行ex-svc.yaml后查看svc信息发现域名出现

kubectl apply -f ex-svc.yaml
kubectl get svc

在这里插入图片描述

dig查看详细解析A记录

dig -t A my-service.default.svc.cluster.local. @10.96.0.10

在这里插入图片描述
编辑my-service

kubectl edit svc my-service
改为www.baidu.com

查看svc发现域名也已经变为百度,再次dig查看详细解析A记录时发现域名也变为百度。

dig -t A my-service.default.svc.cluster.local. @10.96.0.10

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一章介绍docker的前世今生,了 解docker的实现原理,以Django项目为例,教大家如何编写最佳的Dockerfile实现构业务镜像的制作。通过本章的学习,大家会知道docker的概念及基本操作,并学会构建自己的业务镜像,并通过抓包的方式掌握Docker最常用的bridge网络模式的通信。第二章本章学习kubernetes的架构及工作流程,重点介绍如本章学习kubernetes的架构及工作流程,重点介绍如断的滚动更新,通过服务发现来实现集群内部的服务间访问,并通过ingress- -nginx实现外部使用域名访问集群内部的服务。同时介绍基于EFK如何搭建Kubernetes集群的日志收集系统。学完本章,我们的Django demo项目已经可以运行在k8s集群中,同时我们可以使用域名进行服务的访问。第三章本章基于k8s集群部署gitlab、sonarQube、 Jenkins等工具,并把上述工具集成到Jenkins中,以Django项目为例,通过多分支流水线及Jenkinsfle实现项目代码提交到不同的仓库分支,实现自动代码扫描、单元测试、docker容器构建、k8s服务的自动部署。第章由于公司内部项目众多,大量的项目使用同一套流程做CICD,那么势必会存在大量的重复代码,因此本章主要通过使用groovy实现Jenkins的sharedL ibrary的开发,以提取项目在CICD实践过程中的公共逻辑,提供一系列的流程的接口供公司内各项目调用,开发完成后,还是以Django的demo项目为例,进行Jenkinsfle的改造,最后仅需通过简单的Jenkinsfle的配置,即可优雅的完成CICD流程的整个过程,此方式已在大型企业内部落地应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热到想喝冰阔落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值