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