kubernetes中的微服务详解

华子目录

  • 什么是微服务
  • 微服务的类型
  • ipvs模式
    • ipvs模式配置方式
      • 注意
  • 微服务类型详解
    • `ClusterIP`类型
      • `Services`创建后`集群DNS`提供`解析`
      • `ClusterIP`中的特殊模式:`headless无头服务`
    • NodePort类型
      • 访问过程
      • NodePort默认端口
    • `LoadBalancer`类型
      • 访问过程
      • metalLB
        • metalLB功能
        • 部署metalLB
    • `ExternalName`类型

什么是微服务

控制器来完成集群工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问

  • Service是一组提供相同服务的Pod对外开放的接口
  • 借助Service,应用可以实现服务发现负载均衡
  • Service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

在这里插入图片描述

微服务的类型

微服务类型作用描述
ClusterIP默认值k8s系统给service自动分配的虚拟ip,只能在集群内部进行访问
NodePortservice通过指定的node上的端口暴露外部,访问任意一个nodeIP:nodePort都将路由到ClusterIP
LoadBalancerNodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort,此模式只能在云服务器上使用
ExternalName服务通过DNS cname记录方式转发到指定的域名(通过spec.externalName设定)
[root@k8s-master ~]# mkdir services
[root@k8s-master ~]# cd services/
#生成控制器文件并建立控制器
[root@k8s-master services]# kubectl create deployment huazi --image myapp:v1 --replicas 2 --dry-run=client -o yaml > huazi-service.yml
[root@k8s-master services]# ls
huazi-service.yml
[root@k8s-master services]# kubectl apply -f huazi-service.yml
deployment.apps/huazi created
[root@k8s-master services]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
huazi-646d7864fd-4rtxl   1/1     Running   0          8s    10.244.2.7   k8s-node2.org   <none>           <none>
huazi-646d7864fd-kxsg9   1/1     Running   0          8s    10.244.1.8   k8s-node1.org   <none>           <none>


[root@k8s-master services]# kubectl expose deployment huazi --port 8080 --target-port 80 --dry-run=client -o yaml >> huazi-service.yml
[root@k8s-master services]# vim huazi-service.yml
[root@k8s-master services]# cat huazi-service.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: huazi
  name: huazi
spec:
  replicas: 2
  selector:
    matchLabels:
      app: huazi
  template:
    metadata:
      labels:
        app: huazi
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---            #不同资源间用---隔开
apiVersion: v1
kind: Service
metadata:
  labels:
    app: huazi
  name: huazi
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: huazi
[root@k8s-master services]# kubectl apply -f huazi-service.yml
deployment.apps/huazi configured
service/huazi created
[root@k8s-master services]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
huazi        ClusterIP   10.109.230.54   <none>        8080/TCP   10s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    17d

#services的缩写:svc
[root@k8s-master services]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
huazi        ClusterIP   10.109.230.54   <none>        8080/TCP   50s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    17d



[root@k8s-master services]# kubectl get svc huazi --show-labels
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE     LABELS
huazi   ClusterIP   10.109.230.54   <none>        8080/TCP   3m13s   app=huazi



[root@k8s-master services]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE            NOMINATED NODE   READINESS GATES
huazi-646d7864fd-4rtxl   1/1     Running   0          9m21s   10.244.2.7   k8s-node2.org   <none>           <none>
huazi-646d7864fd-kxsg9   1/1     Running   0          9m21s   10.244.1.8   k8s-node1.org   <none>           <none>


[root@k8s-master services]# kubectl describe svc huazi
Name:              huazi
Namespace:         default
Labels:            app=huazi
Annotations:       <none>
Selector:          app=huazi
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.109.230.54
IPs:               10.109.230.54
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.8:80,10.244.2.7:80
Session Affinity:  None
Events:            <none>

在这里插入图片描述

[root@k8s-master services]# curl 10.109.230.54:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
  • serviceapp标签和控制器中的app标签是一样的
  • 如果pod标签services一致,则podipEndpoints中,如果不一致,会从Endpoints中移除
#可以在火墙中查看策略信息
[root@k8s-master services]# iptables -t nat -nL
Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-SVC-NHHAOEMW36LYR3Y5  tcp  --  0.0.0.0/0            10.109.230.54        /* default/huazi cluster IP */ tcp dpt:8080

ipvs模式

  • Services是由kube-proxy组件,加上iptables共同实现
  • kube-proxy通过iptables处理Services的过程,需要在宿主机上设置相当多iptables规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源
  • IPVS模式的Services,可以使k8s集群支持更多量级Pod

ipvs模式配置方式

  • 所有节点中安装ipvsadm
[root@k8s-master services]# yum install ipvsadm -y
[root@k8s-node1 ~]# yum install ipvsadm -y
[root@k8s-node1 ~]# yum install ipvsadm -y
  • 修改master节点的代理配置
[root@k8s-master services]# kubectl -n kube-system edit cm kube-proxy

在这里插入图片描述

  • 重启pod。在pod运行时配置文件中采用默认配置,当改变配置文件已经运行pod状态不会变化,所以要重启pod
[root@k8s-master services]# kubectl -n kube-system get pods | awk '/kube-proxy/{system("kubectl -n kube-system delete pods "$1)}'

在这里插入图片描述
在这里插入图片描述

注意

切换ipvs模式后,kube-proxy会在宿主机上添加一个虚拟网卡kube-ipvs0,并分配所有serviceIP

[root@k8s-master services]# ip a | tail -n 8
8: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
    link/ether 22:eb:d5:60:29:26 brd ff:ff:ff:ff:ff:ff
    inet 10.96.0.10/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.109.230.54/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.96.0.1/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever

在这里插入图片描述

  • 当删掉services后,ipvs中的策略自动没了
[root@k8s-master services]# kubectl delete svc huazi
service "huazi" deleted
[root@k8s-master services]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 172.25.254.100:6443          Masq    1      0          0
TCP  10.96.0.10:53 rr
  -> 10.244.0.2:53                Masq    1      0          0
  -> 10.244.0.3:53                Masq    1      0          0
TCP  10.96.0.10:9153 rr
  -> 10.244.0.2:9153              Masq    1      0          0
  -> 10.244.0.3:9153              Masq    1      0          0
UDP  10.96.0.10:53 rr
  -> 10.244.0.2:53                Masq    1      0          0
  -> 10.244.0.3:53                Masq    1      0          0

微服务类型详解

ClusterIP类型

clusterip模式只能在集群内访问,并对集群内pod提供健康检测自动发现功能

[root@k8s-master services]# kubectl run testpod --image myapp:v1
pod/testpod created

[root@k8s-master services]# kubectl get pods -o wide --show-labels
NAME      READY   STATUS    RESTARTS   AGE     IP           NODE            NOMINATED NODE   READINESS GATES   LABELS
testpod   1/1     Running   0          3m56s   10.244.2.9   k8s-node2.org   <none>           <none>            run=testpod
[root@k8s-master services]# kubectl expose pod testpod --port 8080 --target-port 80 --dry-run=client -o yaml > testpod-svc.yml


[root@k8s-master services]# vim testpod-svc.yml
[root@k8s-master services]# cat testpod-svc.yml
apiVersion: v1
kind: Service
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    run: testpod
  type: ClusterIP   #设置类型为ClusterIP
[root@k8s-master services]# kubectl apply -f testpod-svc.yml
service/testpod created


[root@k8s-master services]# kubectl get svc testpod
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
testpod   ClusterIP   10.101.174.36   <none>        8080/TCP   60s


[root@k8s-master services]# kubectl describe svc testpod
Name:              testpod
Namespace:         default
Labels:            run=testpod
Annotations:       <none>
Selector:          run=testpod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.101.174.36
IPs:               10.101.174.36
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.2.9:80
Session Affinity:  None
Events:            <none>
[root@k8s-master services]# ipvsadm -Ln

我们发现ipvs策略自动添加了

在这里插入图片描述

[root@k8s-master services]# kubectl run testpod1 --image myapp:v1
pod/testpod1 created

[root@k8s-master services]# kubectl get pods -o wide --show-labels
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES   LABELS
testpod    1/1     Running   0          12m   10.244.2.9    k8s-node2.org   <none>           <none>            run=testpod
testpod1   1/1     Running   0          12s   10.244.1.10   k8s-node1.org   <none>           <none>            run=testpod1
[root@k8s-master services]# ipvsadm -Ln

在这里插入图片描述

#当改完标签后,发现testpod1加入到ipvs中
[root@k8s-master services]# kubectl label pod testpod1 run=testpod --overwrite
pod/testpod1 labeled

[root@k8s-master services]# ipvsadm -Ln

在这里插入图片描述

Services创建后集群DNS提供解析

[root@k8s-master services]# kubectl -n default get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    17d
testpod      ClusterIP   10.101.174.36   <none>        8080/TCP   8m43s



[root@k8s-master services]# kubectl -n kube-system get svc
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   17d
[root@k8s-master services]# dig testpod.default.svc.cluster.local @10.96.0.10

; <<>> DiG 9.16.23-RH <<>> testpod.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36803
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 148e67c3c114f1a0 (echoed)
;; QUESTION SECTION:
;testpod.default.svc.cluster.local. IN  A

;; ANSWER SECTION:
testpod.default.svc.cluster.local. 30 IN A      10.101.174.36

;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Mon Oct 21 09:38:00 EDT 2024
;; MSG SIZE  rcvd: 123

在这里插入图片描述
运行一个busyboxplus,在集群内部通过域名访问

[root@k8s-master services]# kubectl run busybox -it --image busyboxplus
/ # curl testpod.default.svc.cluster.local.:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

因为每开一个podip都会变,所以集群内部沟通都是通过域名进行访问的

/ # curl testpod:8080   #域名会自动补全
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # nslookup testpod
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      testpod
Address 1: 10.101.174.36 testpod.default.svc.cluster.local
#我们发现域名对应的是Services上的ip
#域名自动补全的原因是:/etc/resolv.conf中有记录
/ # cat /etc/resolv.conf
nameserver 10.96.0.10   
search default.svc.cluster.local svc.cluster.local cluster.local org
options ndots:5

ClusterIP中的特殊模式:headless无头服务

  • 流量不经过services,而是直接发送给pod
  • 对于无头Services并不会分配Cluster IPkube-proxy不会处理它们, 而且平台不会为它们进行负载均衡路由集群访问通过dns解析直接指向到业务pod上的IP所有的调度dns单独完成
[root@k8s-master services]# kubectl create deployment huazi --image myapp:v1 --dry-run=client --replicas 2 -o yaml > huazi-dp.yml

[root@k8s-master services]# kubectl apply -f huazi-dp.yml

[root@k8s-master services]# kubectl expose deployment huazi --port 8080 --target-port 80 --dry-run=client -o yaml >> huazi-svc.yml

[root@k8s-master services]# kubectl apply -f huazi-svc.yml

[root@k8s-master services]# ls
huazi-dp.yml  huazi-svc.yml
[root@k8s-master services]# kubectl get pods -o wide --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES   LABELS
huazi-646d7864fd-hs848   1/1     Running   0          7m39s   10.244.2.12   k8s-node2.org   <none>           <none>            app=huazi,pod-template-hash=646d7864fd
huazi-646d7864fd-jzg6b   1/1     Running   0          7m39s   10.244.1.12   k8s-node1.org   <none>           <none>            app=huazi,pod-template-hash=646d7864fd


[root@k8s-master services]# kubectl get svc huazi
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
huazi   ClusterIP   10.97.121.243   <none>        8080/TCP   2m20s
[root@k8s-master services]# vim huazi-svc.yml

在这里插入图片描述

[root@k8s-master services]# kubectl delete -f huazi-svc.yml
service "huazi" deleted

[root@k8s-master services]# kubectl apply -f huazi-svc.yml
service/huazi created
[root@k8s-master services]# kubectl describe svc huazi

在这里插入图片描述

[root@k8s-master services]# kubectl run busybox -it --image busyboxplus
If you don't see a command prompt, try pressing enter.
/ # nslookup huazi
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      huazi
Address 1: 10.244.2.12 10-244-2-12.huazi.default.svc.cluster.local
Address 2: 10.244.1.12 10-244-1-12.huazi.default.svc.cluster.local
# 我们发现域名直接映射到了pod的ip,而不是services上的ip
#进入到busybox中,访问域名

[root@k8s-master services]# kubectl exec -it busybox -- /bin/sh
/ # curl huazi
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master services]# ipvsadm -Ln

在这里插入图片描述

NodePort类型

通过ipvs暴漏端口从而使外部主机通过master节点的对外ip:port来访问pod业务

访问过程

在这里插入图片描述

[root@k8s-master services]# vim huazi-dp.yml
[root@k8s-master services]# cat huazi-dp.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: huazi
  name: huazi
spec:
  replicas: 2
  selector:
    matchLabels:
      app: huazi
  template:
    metadata:
      labels:
        app: huazi
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master services]# vim huazi-svc.yml
[root@k8s-master services]# cat huazi-svc.yml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: huazi
  name: huazi
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: huazi
  type: NodePort


[root@k8s-master services]# kubectl apply -f huazi-dp.yml
deployment.apps/huazi created
[root@k8s-master services]# kubectl apply -f huazi-svc.yml
service/huazi created


[root@k8s-master services]# kubectl get pods -o wide --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES   LABELS
huazi-646d7864fd-9877k   1/1     Running   0          38s   10.244.2.4   k8s-node2.org   <none>           <none>            app=huazi,pod-template-hash=646d7864fd
huazi-646d7864fd-j24st   1/1     Running   0          38s   10.244.1.3   k8s-node1.org   <none>           <none>            app=huazi,pod-template-hash=646d7864fd


[root@k8s-master services]# kubectl get svc huazi
NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
huazi   NodePort   10.96.205.98   <none>        8080:30310/TCP   18s
[root@k8s-master services]# ipvsadm -Ln

在这里插入图片描述

[root@k8s-master services]# kubectl describe svc huazi
Name:                     huazi
Namespace:                default
Labels:                   app=huazi
Annotations:              <none>
Selector:                 app=huazi
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.96.205.98
IPs:                      10.96.205.98
Port:                     <unset>  8080/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30310/TCP
Endpoints:                10.244.1.3:80,10.244.2.4:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

访问master的ip:port
在这里插入图片描述

NodePort默认端口

NodePort默认端口是30000-32767超出会报错

[root@k8s-master services]# vim huazi-svc.yml

在这里插入图片描述

[root@k8s-master services]# kubectl apply -f huazi-svc.yml
service/huazi configured
[root@k8s-master services]# kubectl get svc huazi
NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
huazi   NodePort   10.96.205.98   <none>        8080:30000/TCP   10m

访问master的ip:port
在这里插入图片描述

[root@k8s-master services]# vim huazi-svc.yml

在这里插入图片描述

[root@k8s-master services]# kubectl apply -f huazi-svc.yml
The Service "huazi" is invalid: spec.ports[0].nodePort: Invalid value: 33333: provided port is not in the valid range. The range of valid ports is 30000-32767

在这里插入图片描述

  • 发现报错了,端口范围只能在30000-32767

如果需要使用这个范围以外端口就需要特殊设定

  • 添加“--service-node-port-range=“ 参数,端口范围可以自定义
  • 修改后api-server自动重启,等api-server正常启动后才能操作集群
  • 集群重启自动完成在修改完参数后全程不需要人为干预
[root@k8s-master services]# vim /etc/kubernetes/manifests/kube-apiserver.yaml

在这里插入图片描述
改了之后,集群自动重启

#我们发现现在就不报错了
[root@k8s-master services]# kubectl apply -f huazi-svc.yml
service/huazi configured


[root@k8s-master services]# kubectl get svc huazi
NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
huazi   NodePort   10.96.205.98   <none>        8080:33333/TCP   27m

访问master的ip:port
在这里插入图片描述

LoadBalancer类型

云平台会为我们分配vip实现访问,如果是裸金属主机那么需要metallb来实现ip分配

访问过程

在这里插入图片描述

[root@k8s-master services]# kubectl delete -f huazi-svc.yml
service "huazi" deleted


[root@k8s-master services]# vim huazi-svc.yml

在这里插入图片描述

[root@k8s-master services]# kubectl apply -f huazi-svc.yml
service/huazi created


#我们可以发现EXTERNAL-IP处于pending状态,表示外部负载均衡器的IP地址尚未分配
[root@k8s-master services]# kubectl get svc huazi
NAME    TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
huazi   LoadBalancer   10.97.214.7   <pending>     8080:34662/TCP   8s
  • 我们可以发现EXTERNAL-IP处于pending状态,表示外部负载均衡器IP地址未分配

LoadBalancer模式适用云平台裸金属环境需要安装metallb提供支持

metalLB

官网:https://metallb.universe.tf/installation/

在这里插入图片描述

metalLB功能
  • LoadBalancer分配vip
部署metalLB
  • 设置ipvs模式
#cm是ConfigMap的缩写
[root@k8s-master services]# kubectl edit cm -n kube-system kube-proxy

在这里插入图片描述

  • 重启pod。在pod运行时配置文件中采用默认配置,当改变配置文件已经运行pod状态不会变化,所以要重启pod
[root@k8s-master services]# kubectl -n kube-system get pods | awk '/kube-proxy/{system("kubectl -n kube-system delete pods "$1)}'
  • 下载部署文件metallb-native.yaml

在这里插入图片描述

[root@k8s-master metalLB]# ls
configmap.yml  metallb-native.yaml  metalLB.tag.gz
  • 修改metallb-native.yaml文件中镜像地址,与harbor仓库路径保持一致
[root@k8s-master metalLB]# vim metallb-native.yaml
...
...
...
image: metallb/controller:v0.14.8
image: metallb/speaker:v0.14.8
...
...
...
  • 上传镜像

在这里插入图片描述

[root@k8s-master metalLB]# docker load -i metalLB.tag.gz

[root@k8s-master metalLB]# docker tag quay.io/metallb/controller:v0.14.8 harbor.huazi.org/metallb/controller:v0.14.8
[root@k8s-master metalLB]# docker tag quay.io/metallb/speaker:v0.14.8 harbor.huazi.org/metallb/speaker:v0.14.8
[root@k8s-master metalLB]# docker push harbor.huazi.org/metallb/controller:v0.14.8
[root@k8s-master metalLB]# docker push harbor.huazi.org/metallb/speaker:v0.14.8

在这里插入图片描述

[root@k8s-master metalLB]# kubectl apply -f metallb-native.yaml

在这里插入图片描述

[root@k8s-master metalLB]# kubectl -n metallb-system get pods
NAME                          READY   STATUS    RESTARTS   AGE
controller-65957f77c8-2p2hj   1/1     Running   0          65s
speaker-jhdfd                 1/1     Running   0          65s
speaker-rflp2                 1/1     Running   0          65s
speaker-vvtlf                 1/1     Running   0          65s
[root@k8s-master metalLB]# cat configmap.yml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool    #地址池名称
  namespace: metallb-system
spec:
  addresses:
  - 172.25.254.50-172.25.254.99   #修改为自己本地地址段

---                           #两个不同的kind中间必须加分割
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool    #使用地址池
[root@k8s-master metalLB]# kubectl apply -f configmap.yml
ipaddresspool.metallb.io/first-pool created
l2advertisement.metallb.io/example created
[root@k8s-master metalLB]# kubectl -n metallb-system get configmaps
NAME                DATA   AGE
kube-root-ca.crt    1      8m29s
metallb-excludel2   1      8m29s

此时我们发现:EXTERNAL-IP已经分配了

[root@k8s-master metalLB]# kubectl get svc huazi
NAME    TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
huazi   LoadBalancer   10.97.214.7   172.25.254.50   8080:34662/TCP   51m
  • 172.25.254.50是一个vip

在这里插入图片描述

  • 172.25.254.100master真实ip

在这里插入图片描述
真正的云平台上,EXTERNAL-IP是一个公网ip

ExternalName类型

  • 开启Services后,不会被分配IP,而是用dns解析CNAME固定域名来解决ip变化问题
  • 一般应用于外部业务pod沟通或外部业务迁移到pod内时
  • 应用集群迁移过程中,externalname过度阶段就可以起作用了。
  • 集群外的资源迁移到集群时,在迁移的过程ip可能会变化,但是域名+dns解析能完美解决此问题
[root@k8s-master services]# kubectl delete -f huazi-svc.yml
service "huazi" deleted


[root@k8s-master services]# vim huazi-svc.yml

在这里插入图片描述

[root@k8s-master services]# kubectl apply -f huazi-svc.yml
service/huazi created


[root@k8s-master services]# kubectl get svc huazi
NAME    TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)    AGE
huazi   ExternalName   <none>       www.baidu.com   8080/TCP   8s
[root@k8s-master services]# kubectl -n kube-system get svc
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   18d

在这里插入图片描述

[root@k8s-master services]# kubectl describe svc huazi
Name:              huazi
Namespace:         default
Labels:            app=huazi
Annotations:       <none>
Selector:          app=huazi
Type:              ExternalName
IP Families:       <none>
IP:
IPs:               <none>
External Name:     www.baidu.com
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>
#我们可以看到:是百度的服务器在响应
[root@k8s-master services]# kubectl run -it busybox --image busyboxplus
If you don't see a command prompt, try pressing enter.
/ # ping huazi
PING huazi (183.2.172.185): 56 data bytes
64 bytes from 183.2.172.185: seq=0 ttl=127 time=36.577 ms
64 bytes from 183.2.172.185: seq=1 ttl=127 time=34.153 ms
64 bytes from 183.2.172.185: seq=2 ttl=127 time=33.778 ms
64 bytes from 183.2.172.185: seq=3 ttl=127 time=33.871 ms
64 bytes from 183.2.172.185: seq=4 ttl=127 time=36.072 ms
  • ExternalName本质:在集群内部指定一个serviceip,与外部ip进行绑定
  • 当访问集群内部指定一个serviceip,实际访问的是集群外部ip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度搜索推广和信息流推广的区别,分别适用于什么场景!

信息流推广和搜索广告&#xff0c;不仅仅是百度&#xff0c;是很多平台的两个核心推广方式。 1、搜索广告&#xff1a; 就是基于用户的搜索习惯&#xff0c;更多是用户有疑问、还有用户当下就要做出行动的广告。 比如上门服务、线上咨询服务、招商加盟、了解产品各种型号和信…

[JAVA]JDBC如何实现写数据?——利用Java新增MySQL中存储的员工字段信息

我们在实现JDBC写数据之前需要先工具类做一些前置准备。—封装DbUtils工具类&#xff0c;是一个用于操作数据库的工具类&#xff0c;它提供了一些便捷的方式来执行SQL语句&#xff0c;获取数据库连接等。简化程序的开发。DbUtils工具类主要帮我们封装&#xff0c;打开连接&…

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加&#xff0c;传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构&#xff08;Plug-In Architecture&#xff09;作为一种模块化设计方式&#xff0c;通过动态加载和运行子VI&#xff0c;使系统功能更加灵活、模块化&…

【LLM之Agent】《Tool Learning with Large Language Models: A Survey》论文阅读笔记

概述 背景信息 近年来&#xff0c;基于大型语言模型&#xff08;LLMs&#xff09;的工具学习成为增强LLMs应对复杂任务能力的有力范式。尽管这一领域快速发展&#xff0c;现有文献的碎片化以及缺乏系统组织&#xff0c;给新入门者带来了阻碍。因此&#xff0c;本论文旨在对现…

Chrome DevTools 二: Performance 性能面板

Chrome DevTools 第二篇 Performance 主要介绍performance在我们日常开发中所起到的作用&#xff0c;以及如何利用performance 面板进行性能分析和相关优化建议。 性能面板 Performance 记录和分析页面运行中的所有活动&#xff0c;是解决前端性能问题的重要工具。 1. 控制栏…

分布式链路追踪-01初步认识SkyWalking

一 SkyWaling是什么&#xff1f; Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统&#xff0c;提供分布式追踪、服务网格遥…

idea 无法输入中文 快速解决

idea在某些情况会出现无法输入中文的情况&#xff0c;我们不去深究内部原因&#xff0c;直接上解决方案&#xff1a; 1、点击菜单help->Edit Custom VM Options 2、最后一行&#xff0c;追加&#xff1a; -Drecreate.x11.input.methodtrue 、 3、重启

软件分享丨PDF Shaper

【资源名】PDF Shaper 【地址】https://www.pdfshaper.com/ 【资源介绍】 PDF Shaper Professional是一款功能强大的PDF文档编辑与转换工具&#xff0c;使用它可以对PDF文件进行各种转换、提取、合并、旋转、加密、解密等编辑操作&#xff0c;主要功能有分割和合并PDF文件&…

无人机飞手执照培训为什么需要脱产学习?

无人机飞手执照培训需要脱产学习的原因主要基于以下几个方面&#xff1a; 一、知识体系的系统性与复杂性 无人机飞手培训涵盖的内容广泛且深入&#xff0c;包括无人机基础知识、飞行原理、气象学、法律法规等多个方面。这些知识体系相互关联&#xff0c;需要学员进行系统的学…

排序算法 —— 计数排序

目录 1.计数排序的思想 2.计数排序的实现 3.计数排序的分析 时间复杂度 空间复杂度 稳定性 优点 缺点 1.计数排序的思想 顾名思义&#xff0c;计数排序就是通过计数的方式来排序&#xff0c;其基本思想为&#xff1a; 开辟一个计数数组&#xff0c;统计每个数出现的次…

Windows 10、Office 2016/2019 和 PPTP 和 L2TP协议即将退役,企业应尽早做好准备

关心微软技术和产品的朋友一定对这个网站很熟悉&#xff1a;https://microsoftgraveyard.com/&#xff0c;这里静静的躺着很多微软技术和产品。近日&#xff0c;微软又在准备一场新的“告别仪式”了&#xff0c;这次是 Windows 10、Office 2016/2019 和一些老旧的协议与技术。让…

【Linux】按时间抽取附件

#1024程序员节&#xff5c;征文# 希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 附件表 t_file 中有创建时间&#xff0c;需求是抽取202407-202408 月创建的附件到指定目录&#xff0c;并保持层级目录。 解决方案&#xff1a;由于抽取的附件条数…

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整&#xff0c;仅供参考&#xff01; 除WEB&#xff0c;RE&#xff0c;PWN外&#xff0c;其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

ES6:let和const命令解读以及变量的解构赋值

有时候&#xff0c;我们需要的不是答案&#xff0c;而是一双倾听的耳朵 文章目录 let和const命令变量的解构赋值 let和const命令 let和const命令都是声明变量的关键字&#xff0c;类同varlet特点 用来声明变量&#xff0c;不能再次定义&#xff0c;但是值可以改变存在块级作用…

【Nuvoton干货分享】开发应用篇 5 -- 32bit MCU Flash 操作

在实际开发中&#xff0c;我们都会碰到需要把部分数据存放在不易失存储空间上&#xff0c;比如外部NOR FLASH、EEPROM、SD等存储空间上&#xff0c;针对数据量不大的情况下&#xff0c;可以考虑将数据存放在芯片ROM存储空间。Nuvoton 32bit MCU ROM存储空间包括LDROM、APROM、S…

什么是缓存?

缓存是将文件副本存储在临时位置的过程&#xff0c;以便可以更快地访问这些文件。从技术上讲&#xff0c;缓存是文件或数据副本的任何临时存储位置&#xff0c;但通常是指互联网技术中的缓存。Web 浏览器缓存 HTML 文件、JavaScript 和图像&#xff0c;以便更快地加载网站&…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

npm run serve 提示异常Cannot read property ‘upgrade‘ of undefined

npm run serve 提示Cannot read property ‘upgrade’ of undefined 一般是proxy的target代理域名问题导致的&#xff0c;如下&#xff1a; 解决方案&#xff1a; proxy: { “/remoteDealerReportApi”: { target: ‘http://demo-.com.cn’, //此域名有问题&#xff0c;会导致…

阿里云项目启动OOM问题解决

#1024程序员节&#xff5c;征文# 问题描述 随着项目业务的增长&#xff0c;系统启动时内存紧张&#xff0c;每次第一次启动的时候就会出现oom第二次或者第n的时候&#xff0c;就启动成功了。 带着这个疑问&#xff0c;我就在阿里云上提交了工单&#xff0c;咨询为什么第一次…

WIFI、NBIOT、4G模块调试AT指令连接华为云物联网服务器(MQTT协议)

一、前言 随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;越来越多的设备开始连接到互联网&#xff0c;形成了一个万物互联的世界。在这个背景下&#xff0c;设备与云端之间的通讯变得尤为重要。 本文将探讨几种常见的无线通信模块——EC20-4G、Air724ug-4…