externalName和externalIP的使用
  qw1dHH2kI2RK 2023年11月02日 55 0

externalName:将外部的服务引用到k8s集群内部,也称别名服务

工作原理:会在coredns上相关域名上生成cname记录

使用背景:让使用者像调用内部服务一样使用外部服务

实际场景使用,可以引用外部的数据库服务,以IP或者端口方式


ExternalName

使用方式

1.通过域名映射

一句话总结:通过别名服务B,去访问外部服务A

创建测试网站
[root@k8s-master1 external_hostname]# cat myweb_deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: myweb
  name: myweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myweb
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: myweb
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}


---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: myweb
  name: myweb
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myweb
  type: NodePort
status:
  loadBalancer: {}


2.查看是否已经成功
[root@k8s-master1 external_hostname]# kubectl get svc
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP                       PORT(S)        AGE
external123   ClusterIP      None           <none>                            <none>         29m
external456   ExternalName   <none>         myweb.default.svc.cluster.local   <none>         11m
kubernetes    ClusterIP      10.96.0.1      <none>                            443/TCP        113d
myweb         NodePort       10.96.19.155   <none>                            80:31597/TCP   10h
[root@k8s-master1 external_hostname]# curl 10.96.19.155 -I
HTTP/1.1 200 OK
Server: nginx/1.21.4
Date: Tue, 28 Dec 2021 18:09:17 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 02 Nov 2021 14:49:22 GMT
Connection: keep-alive
ETag: "61814ff2-267"
Accept-Ranges: bytes


3.创建externalName
[root@k8s-master1 external_hostname]# cat external456_svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: external456
  namespace: default
spec:
  type: ExternalName
  externalName: "myweb.default.svc.cluster.local"
status:
  loadBalancer: {}


4.测试别名是否成功(映射别名成功)
[root@k8s-master1 external_hostname]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
busybox-58848984f5-b4w7z   1/1     Running   1          11h
myweb-855c667ff6-h6d8g     1/1     Running   0          11h
[root@k8s-master1 external_hostname]# kubectl exec -it pod/myweb-855c667ff6-h6d8g sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# curl ^Ccurl^C
# curl external456
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>

2.通过IP地址映射

coredns不支持ip地址,所以需要使用endpoint和headless service

创建busybox:
[root@k8s-master1 external_endpoint]# cat busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: busybox
  name: busybox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox        #内置的linux大多数命令,多用于测试
        args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        readinessProbe:           #就绪探针
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10         #10s之后开始第一次探测
          periodSeconds: 5                #第一次探测之后每隔5s探测一次


[root@k8s-master1 external_endpoint]# cat external123_svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: external123
  namespace: default
spec:
  clusterIP: None
status:
  loadBalancer: {}
apiVersion: v1
kind: Endpoints
metadata:
  name: external123
  namespace: default
subsets:
- addresses:
  - ip: 112.80.248.76     # 百度的地址


验证:
[root@k8s-master1 external_endpoint]# kubectl get svc
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP                       PORT(S)        AGE
external123   ClusterIP      None           <none>                            <none>         35m
external456   ExternalName   <none>         myweb.default.svc.cluster.local   <none>         16m
kubernetes    ClusterIP      10.96.0.1      <none>                            443/TCP        113d
myweb         NodePort       10.96.19.155   <none>                            80:31597/TCP   10h
[root@k8s-master1 external_endpoint]# kubectl get ep external123
NAME          ENDPOINTS       AGE
external123   112.80.248.76   35m
[root@k8s-master1 external_endpoint]# kubectl exec -it pod/myweb-855c667ff6-h6d8g sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# curl http://external123:80
# exit^C
# curl http:^[[A^[[A^C
# curl http://external123:80 -I      # 这里已经解析到百度的ip地址了,之所以返回403是因为curl被限制了
HTTP/1.1 403 Forbidden
Server: bfe
Date: Tue, 28 Dec 2021 18:16:07 GMT
Content-Type: text/plain; charset=utf-8

[root@k8s-master1 external_endpoint]# kubectl exec -it busybox-58848984f5-b4w7z sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ping external123
PING external123 (112.80.248.76): 56 data bytes
64 bytes from 112.80.248.76: seq=0 ttl=127 time=65.094 ms
64 bytes from 112.80.248.76: seq=1 ttl=127 time=11.746 m

ExternalIP

使用背景:通过引入外部IP地址,暴露k8s内部的服务

1.创建服务
[root@k8s-master1 externalIP]# cat myweb_svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: myweb
  name: myweb
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myweb
  type: NodePort
  externalIPs:
    - 192.168.41.128


2.查看创建结果
[root@k8s-master1 externalIP]# kubectl get pods,svc -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/busybox-58848984f5-b4w7z   1/1     Running   1          11h   10.100.36.69     k8s-node1   <none>           <none>
pod/myweb-855c667ff6-h6d8g     1/1     Running   0          12h   10.100.169.133   k8s-node2   <none>           <none>


NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP                       PORT(S)        AGE    SELECTOR
service/external123   ClusterIP      None           <none>                            <none>         53m    <none>
service/external456   ExternalName   <none>         myweb.default.svc.cluster.local   <none>         34m    <none>
service/kubernetes    ClusterIP      10.96.0.1      <none>                            443/TCP        113d   <none>
service/myweb         NodePort       10.96.227.98   192.168.41.128                    80:32430/TCP   2m     app=myweb


3.验证
[root@k8s-master1 externalIP]# netstat -tlnp | grep 80
tcp        0      0 192.168.41.128:2380     0.0.0.0:*               LISTEN      89854/etcd          
tcp        0      0 192.168.41.128:80       0.0.0.0:*               LISTEN      90525/kube-proxy    # externalIP服务创建成功后,新增的规则

4.访问成功
[root@k8s-master1 externalIP]# curl 192.168.41.128 -I
HTTP/1.1 200 OK
Server: nginx/1.21.4
Date: Tue, 28 Dec 2021 18:34:16 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 02 Nov 2021 14:49:22 GMT
Connection: keep-alive
ETag: "61814ff2-267"
Accept-Ranges: bytes

实际应用

引用外部数据库服务

apiVersion: v1
kind: Service
metadata:
  name: mongo
spec:
  ports:
    – port: 27017
      targetPort: 49763


---


apiVersion: v1
kind: Endpoints
metadata:
  name: mongo
subsets:
  – addresses:
      – ip: 35.188.8.12
    ports:
      – port: 49763




在该k8s集群内部访问mongo方式:
mongodb://mongo
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

qw1dHH2kI2RK