k8s svc通过externalIPs并结合Keepalived对外暴露服务

这篇具有很好参考价值的文章主要介绍了k8s svc通过externalIPs并结合Keepalived对外暴露服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kubemetes 的 Service需要对集群外暴露,可以通过NodePort、Ingress和LoadBalancer,其中
NodePort:需要预先知道k8s集群节点的IP地址,在使用时需指定node的ip(这样配置存在单点故障);
Ingress:实现的是HTTP(S)负载均衡器,只能代理七层;
LoadBalancer:需要通过云服务商提供的负载均衡器将服务暴露到集群外部。
在非公有云环境的k8s集群上,ClusterIp类型的Service可通过externalIPs设置一个外部的 IP 地址,并且将流量导入到集群内部。externalIps(外部IP)要求是至少能路由到一个k8s节点上。 即如果有外部IP可以路由到一个或多个k8s节点上,就可以把k8s的Service暴露在这个外部IP上,通过访问外部IP+Service的端口将流量接入到集群内。这个IP再通过Keepalived配置为VIP,浮动于多个node节点上,即可避免NodePort单点故障问题。以下是实现步骤

一、基础环境

一个自建的k8s集群,测试环境配置如下

kubectl get node -owide
NAME            STATUS                     ROLES    AGE     VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
192.168.5.124   Ready,SchedulingDisabled   master   3h13m   v1.21.12   192.168.5.124   <none>        Ubuntu 20.04.3 LTS   5.4.0-121-generic   docker://19.3.12
192.168.5.134   Ready                      node     3h11m   v1.21.12   192.168.5.134   <none>        Ubuntu 20.04.3 LTS   5.4.0-81-generic    docker://19.3.12
192.168.5.144   Ready                      node     3h11m   v1.21.12   192.168.5.144   <none>        Ubuntu 20.04.3 LTS   5.4.0-81-generic    docker://19.3.12
master节点网卡信息
ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.124  netmask 255.255.255.0  broadcast 192.168.5.255
node1节点网卡信息
ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.134  netmask 255.255.255.0  broadcast 192.168.5.255
node2节点网卡信息
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.144  netmask 255.255.255.0  broadcast 192.168.5.255

二、Keepalived生成externalIPs

在node1 和 node2上安装配置Keepalived
node1 Keepalived配置

cat /etc/keepalived/keepalived.conf 
global_defs {
    notification_email {
        root@localhost 
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id node1
    vrrp_skip_check_adv_addr 
    #vrrp_strict 
    vrrp_garp_interval 0 
    vrrp_gna_interval 0 
    vrrp_mcast_group4 224.0.0.18 
}
vrrp_instance EIP {
    state MASTER 
    interface ens32
    virtual_router_id 66 
    priority 100 
    advert_int 1
    authentication {
        auth_type PASS #预共享密钥认证,同一个虚拟路由器的keepalived节点必须一样
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.5.200 dev ens32 label ens32:0
    }
}

node2 Keepalived配置

cat /etc/keepalived/keepalived.conf 
global_defs {
    notification_email {
        root@localhost 
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id node2
    vrrp_skip_check_adv_addr 
    #vrrp_strict
    vrrp_garp_interval 0 
    vrrp_gna_interval 0
    vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 66 
    priority 80 
    advert_int 1
    authentication {
        auth_type PASS #预共享密钥认证,同一个虚拟路由器的keepalived节点必须一样
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.5.200 dev ens32 label ens32:0
    }
}

启动Keepalived并验证

systemctl daemon-reload
systemctl start keepalived.service
systemctl enable keepalived.service
systemctl status keepalived.service 
● keepalived.service - Keepalive Daemon (LVS and VRRP)
     Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-01-04 14:26:40 CST; 1h 12min ago
   Main PID: 156590 (keepalived)
      Tasks: 2 (limit: 9413)
     Memory: 1.8M
     CGroup: /system.slice/keepalived.service
             ├─156590 /usr/sbin/keepalived --dont-fork
             └─156603 /usr/sbin/keepalived --dont-fork

查看VIP信息

root@node1:~# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.200  netmask 255.255.255.255  broadcast 0.0.0.0
root@node2:~# ping -c4 192.168.5.200
PING 192.168.5.200 (192.168.5.200) 56(84) bytes of data.
64 bytes from 192.168.5.200: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 192.168.5.200: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 192.168.5.200: icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from 192.168.5.200: icmp_seq=4 ttl=64 time=0.068 ms

--- 192.168.5.200 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3060ms
rtt min/avg/max/mdev = 0.061/0.068/0.074/0.004 ms

三、创建svc并指定externalIPs

借用大佬的镜像创建一个deployment,docker hub地址:https://hub.docker.com/r/ikubernetes/demoapp

cat nginx.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: ikubernetes/demoapp:v1.0 
---
apiVersion: v1
kind: Service
metadata:
  labels:       
    app: nginx-svc         
  name: nginx-svc          
  namespace: default        
spec:
  ports:                
  - name: http   
    port: 80             
    targetPort: 80        
    protocol: TCP               
  selector:
    app: nginx
  externalIPs:
  - 192.168.5.200	# 设置 externalIPs 为VIP
创建资源
kubectl apply -f nginx.yaml
kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-7788867569-hdm4g   1/1     Running   0          64m
nginx-deploy-7788867569-wcqhp   1/1     Running   0          64m
kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP     PORT(S)   AGE
nginx-svc    ClusterIP   10.96.225.101   192.168.5.200   80/TCP    70m

访问测试

while true; do curl 192.168.5.200;sleep 1; done
iKubernetes demoapp v1.0 !! ClientIP: 10.244.104.0, ServerName: nginx-deploy-7788867569-wcqhp, ServerIP: 10.244.166.134!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.5.144, ServerName: nginx-deploy-7788867569-hdm4g, ServerIP: 10.244.104.5!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.104.0, ServerName: nginx-deploy-7788867569-wcqhp, ServerIP: 10.244.166.134!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.5.144, ServerName: nginx-deploy-7788867569-hdm4g, ServerIP: 10.244.104.5!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.104.0, ServerName: nginx-deploy-7788867569-wcqhp, ServerIP: 10.244.166.134!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.5.144, ServerName: nginx-deploy-7788867569-hdm4g, ServerIP: 10.244.104.5!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.104.0, ServerName: nginx-deploy-7788867569-wcqhp, ServerIP: 10.244.166.134!
iKubernetes demoapp v1.0 !! ClientIP: 192.168.5.144, ServerName: nginx-deploy-7788867569-hdm4g, ServerIP: 10.244.104.5!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.104.0, ServerName: nginx-deploy-7788867569-wcqhp, ServerIP: 10.244.166.134!

保持以上访问,停止node1上的Keepalived,模拟节点故障文章来源地址https://www.toymoban.com/news/detail-448483.html

root@node1:~# systemctl stop keepalived.service 
root@node1:~# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
IP漂移至node2节点,curl访问也未出现故障
root@node2:~# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.200  netmask 255.255.255.255  broadcast 0.0.0.0

到了这里,关于k8s svc通过externalIPs并结合Keepalived对外暴露服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s的对外服务ingress

    1、service的作用体现在两个方面 (1)集群内部:不断跟踪pod的变化,更新deployment中的pod对象,基于pod的ip地址不断变化的一种服务发现机制 (2)集群外部:类似于负载均衡器,把流量ip+端口,不涉及转发url(http/https),把请求转发到pod当中 2、service nodeport 容器端口——s

    2024年01月22日
    浏览(33)
  • k8s的对外服务---ingress

    service的作用体现在两个方面: 集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。 集群外部:类似负载均衡器,把流量IP+端口,不涉及转发url(http、https)。把请求转发到pod当中。 service有四种类型: ClusterIP:创建servic

    2024年01月20日
    浏览(35)
  • k8s 对外服务之 Ingress

    service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。 在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,

    2024年02月16日
    浏览(32)
  • k8s的对外服务--ingress

    service作用体现在两个方面 1、集群内部 不断跟踪pod的变化,更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制 2、集群外部 类似负载均衡器,把流量ip+端口,不涉及转发url(http,https),把请求转发到pod nodePort:容器端口----service端口----nodePort,设定了no

    2024年01月20日
    浏览(39)
  • k8s之对外服务ingress

    ①集群内部: 不断跟踪pod的变化,不断更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制(endpoint存储最终对外提供服务的IP地址和端口) ②集群外部: 类似负载均衡器,不涉及转发url(不涉及http和https),把流量(IP地址+端口)转发到pod中 (1)nodeport:

    2024年01月18日
    浏览(36)
  • k8s---ingress对外服务(traefik)

    目录 ingress的证书访问 traefik traefik的部署方式: deamonset deployment nginx-ingress与traefix-ingress相比较 nginx-ingress-controller ui访问 deployment部署 ingress实现https代理访问: 需要证书和密钥 创建证书 密钥 secrets 保存密钥信息,部署pod时把secrets挂载到pod 创建密钥和证书 nginx的登录账户认证

    2024年01月19日
    浏览(31)
  • K8s基础8——svc基础使用、应用暴露、iptables代理、ipvs代理

    Service存在的意义? 引入Service主要是解决Pod的动态变化,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。 若提供服务的容器应用是分布式,所以存在多个pod副本,而Pod副本数量可能在运行过程中

    2024年02月11日
    浏览(31)
  • k8s---ingress对外服务(ingress-controller)

    k8s的对外服务,ingress service作用现在两个方面: 1、集群内部:不断跟踪的变化,更新endpoint中的pod对象,基于pod的ip地址不断变化的一种服务发现机制。 2、集群外部:类似于负载均衡器,把流量(ip+端口),不涉及转发url(http https),把请求转发到pod当中。 service: NodePo

    2024年01月19日
    浏览(37)
  • K8S、keepalived、haproxy 高可用集群实战

    K8S、keepalived、haproxy 高可用集群实战 环境:Centos7.6、2个CPU、8G内存以上配置 Master1:172.20.26.24 Master2:172.20.26.86 Master3:172.20.26.89 Node1:    172.20.26.104 VIP :172.20.26.201 在master1、2、3、Node1上:关闭selinux、firewalld、安装net-tools、lrzsz、vim、epel-release、yum update 一、K8S所有节点(mas

    2024年02月22日
    浏览(29)
  • 用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问

    核心一览 Helm 的使用 NFS 搭建 配置文件 一点心得 简单回忆下这个运行环境 👇(很烦,感觉给自己挖了个大坑🕳/(ㄒoㄒ)/~~) 宿主机 Traefik Minikube Ingress Service Pod helm 官网快速上手👉 helm.sh/zh/docs/int… 安装 下载地址 : github.com/helm/helm/r… 三大概念 Chart 代表着 Helm 包。 Repos

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包