文章目录
Service 对外暴露与应用
Service
Kubernetes Service定义了这样一种抽象:逻辑上的一组 Pod,一种能够访问它们的策略 —— 一般被称为微服务。这一组 Pod 可以被 Service 访问到,一般是经过 selector实现的。
举例:考虑一个图片处理 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪一个 backend 副本。 然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不必知道,并且也不需要跟踪这一组 backend 的状态。Service 定义的抽象可以解耦这种关联。
Service能够提供负载均衡的能力,可是使用上存在以下限制:
- 只能提供4层负载均衡能力,而没有7层功能。有时咱们可能须要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的、
如web访问的service服务示例图:
VIP和Service代理
在 Kubernetes 集群中,每一个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式。后端
从Kubernetes v1.0开始,已经可使用 userspace代理模式。Kubernetes v1.1添加了 iptables 代理模式,在 Kubernetes v1.2 中kube-proxy 的 iptables 模式成为默认设置。Kubernetes v1.8添加了 ipvs 代理模式。
为何不使用 DNS 轮询?
缘由以下:
-
DNS 实现的历史由来已久,它不遵照记录 TTL,而且在名称查找到结果后会对其进行缓存。
-
有些应用程序仅执行一次 DNS 查找,并没有限期地缓存结果。
-
即便应用和库进行了适当的从新解析,DNS 记录上的 TTL 值低或为零也可能会给 DNS 带来高负载,从而使管理变得困难
由于有缓存,所以不合适。
userspace代理模式
这种模式,kube-proxy 会监视 Kubernetes master 对 Service 对象和 Endpoints 对象的添加和移除。 对每一个 Service,它会在本地 Node 上打开一个端口(随机选择)。 任何链接到“代理端口”的请求,都会被代理到 Service 的backend Pods 中的某个上面(如 Endpoints 所报告的同样)。 使用哪一个 backend Pod,是 kube-proxy 基于 SessionAffinity 来肯定的。网络
最后,它配置 iptables 规则,捕获到达该 Service 的 clusterIP(是虚拟 IP)和 Port 的请求,并重定向到代理端口,代理端口再代理请求到 backend Pod。
默认状况下,userspace模式下的kube-proxy经过循环算法选择后端。
默认的策略是,经过 round-robin 算法来选择 backend Pod。
iptables 代理模式
这种模式,kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。 对每一个 Service,它会配置 iptables 规则,从而捕获到达该 Service 的 clusterIP 和端口的请求,进而将请求重定向到 Service 的一组 backend 中的某个上面。对于每一个 Endpoints 对象,它也会配置 iptables 规则,这个规则会选择一个 backend 组合。
默认的策略是,kube-proxy 在 iptables 模式下随机选择一个 backend。
使用 iptables 处理流量具备较低的系统开销,由于流量由 Linux netfilter 处理,而无需在用户空间和内核空间之间切换。 这种方法也可能更可靠。
若是 kube-proxy 在 iptables模式下运行,而且所选的第一个 Pod 没有响应,则链接失败。 这与userspace模式不一样:在这种状况下,kube-proxy 将检测到与第一个 Pod 的链接已失败,并会自动使用其余后端 Pod 重试。
咱们可使用 Pod readiness 探测器 验证后端 Pod 是否能够正常工做,以便 iptables 模式下的 kube-proxy 仅看到测试正常的后端。这样作意味着能够避免将流量经过 kube-proxy 发送到已知已失败的Pod。
IPVS 代理模式
在 ipvs 模式下,kube-proxy监视Kubernetes服务(Service)和端点(Endpoints),调用 netlink 接口相应地建立 IPVS 规则, 并按期将 IPVS 规则与 Kubernetes服务(Service)和端点(Endpoints)同步。该控制循环可确保 IPVS 状态与所需状态匹配。访问服务(Service)时,IPVS 将流量定向到后端Pod之一。
IPVS代理模式基于相似于 iptables 模式的 netfilter 挂钩函数,可是使用哈希表做为基础数据结构,而且在内核空间中工做。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通讯的延迟要短,而且在同步代理规则时具备更好的性能。与其余代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。
IPVS提供了更多选项来平衡后端Pod的流量。分别是:
- rr: round-robin
- lc: least connection (smallest number of open connections)
- dh: destination hashing
- sh: source hashing
- sed: shortest expected delay
- nq: never queue
注意:要在 IPVS 模式下运行 kube-proxy,必须在启动 kube-proxy 以前使 IPVS Linux 在节点上可用。 当 kube-proxy 以 IPVS 代理模式启动时,它将验证 IPVS 内核模块是否可用。 若是未检测到 IPVS 内核模块,则 kube-proxy 将退回到以 iptables 代理模式运行。
Service服务类型
Kubernetes 中Service有如下4中类型:
- ClusterIP:默认类型,自动分配一个仅Cluster内部能够访问的虚拟IP
- NodePort:经过每一个 Node 上的 IP 和静态端口(NodePort)暴露服务。以ClusterIP为基础,NodePort 服务会路由到 ClusterIP 服务。经过请求 :,能够从集群的外部访问一个集群内部的 NodePort 服务。
- LoadBalancer:使用云提供商的负载均衡器,能够向外部暴露服务。外部的负载均衡器能够路由到 NodePort 服务和 ClusterIP 服务。
- ExternalName:经过返回 CNAME 和它的值,能够将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。没有任何类型代理被建立。
须要注意的是:Service 可以将一个接收 port 映射到任意的 targetPort。默认状况下,targetPort 将被设置为与 port 字段相同的值。
Service域名格式: ( s e r v i c e n a m e ) . (service name). (servicename).(namespace).svc.cluster.local,其中 cluster.local 为指定的集群的域名
ClusterIP:
默认类型,自动分配一个仅Cluster内部能够访问的虚拟IP
// 编写network.yaml文件
[root@master manifes]# vi network.yaml
[root@master manifes]# cat network.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: v1
template:
metadata:
labels:
app: myapp
release: v1
spec:
containers:
- name: myapp
image: linlusama/apache:v2
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: myapp-nodeport
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: v1
ports:
- name: httpd
port: 80
targetPort: 80
//创建资源
[root@master manifes]# kubectl get pods
No resources found in default namespace.
[root@master manifes]# kubectl apply -f network.yaml
deployment.apps/myapp-deploy created
service/myapp-nodeport created
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/myapp-deploy-6bc687c6f5-8xh6x 1/1 Running 0 2m52s
pod/myapp-deploy-6bc687c6f5-jgw95 0/1 ContainerCreating 0 2m52s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d15h
service/myapp-nodeport ClusterIP 10.106.168.53 <none> 80/TCP 35s
//查看iptables
[root@master manifes]# iptables -t nat -nvL | grep 'myapp-nodeport'
0 0 KUBE-MARK-MASQ tcp -- * * !10.244.0.0/16 10.106.168.53 /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:80
0 0 KUBE-SVC-UJB7KAYNZVW7NK6H tcp -- * * 0.0.0.0/0 10.106.168.53 /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:80
0 0 KUBE-SEP-RNUOZG3NEETOGKKN all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ statistic mode random probability 0.50000000000
0 0 KUBE-SEP-O5ORO5ZQMTW4OURT all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */
0 0 KUBE-MARK-MASQ all -- * * 10.244.1.22 0.0.0.0/0 /* default/myapp-nodeport:httpd */
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ tcp to:10.244.1.22:80
0 0 KUBE-MARK-MASQ all -- * * 10.244.2.21 0.0.0.0/0 /* default/myapp-nodeport:httpd */
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ tcp to:10.244.2.21:80
// 访问
[root@master manifes]# curl 10.106.168.53
<html><body><h1>It works!</h1></body></html>
NodePort
nodePort的原理在于在node上开了一个端口,将向该端口的流量导入到kube-proxy,然后由 kube-proxy进一步到给对应的pod
//资源文件
[root@master manifes]# vi network.yaml
[root@master manifes]# cat network.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: v1
template:
metadata:
labels:
app: myapp
release: v1
spec:
containers:
- name: myapp
image: linlusama/apache:v2
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: myapp-nodeport
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: v1
ports:
- name: httpd
port: 80
targetPort: 80
nodePort: 31888
//修改资源文件
[root@master manifes]# kubectl apply -f network.yaml
deployment.apps/myapp-deploy unchanged
service/myapp-nodeport configured
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/myapp-deploy-6bc687c6f5-8xh6x 1/1 Running 0 8m8s
pod/myapp-deploy-6bc687c6f5-jgw95 1/1 Running 0 8m8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
service/myapp-nodeport NodePort 10.106.168.53 <none> 80:31888/TCP 5m51s
//查看iptables规则
[root@master manifes]# iptables -t nat -nvL | grep 'myapp-nodeport'
0 0 KUBE-MARK-MASQ tcp -- * * !10.244.0.0/16 10.106.168.53 /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:80
0 0 KUBE-SVC-UJB7KAYNZVW7NK6H tcp -- * * 0.0.0.0/0 10.106.168.53 /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:80
0 0 KUBE-MARK-MASQ tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ tcp dpt:31888
0 0 KUBE-SVC-UJB7KAYNZVW7NK6H tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ tcp dpt:31888
0 0 KUBE-SEP-RNUOZG3NEETOGKKN all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ statistic mode random probability 0.50000000000
0 0 KUBE-SEP-O5ORO5ZQMTW4OURT all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */
0 0 KUBE-MARK-MASQ all -- * * 10.244.1.22 0.0.0.0/0 /* default/myapp-nodeport:httpd */
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ tcp to:10.244.1.22:80
0 0 KUBE-MARK-MASQ all -- * * 10.244.2.21 0.0.0.0/0 /* default/myapp-nodeport:httpd */
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/myapp-nodeport:httpd */ tcp to:10.244.2.21:80
//访问测试
[root@master manifes]# curl 192.168.200.150:31888
<html><body><h1>It works!</h1></body></html>
LoadBalancer类型示例
在使用支持外部负载均衡器的云提供商的服务时,设置 type 的值为 “LoadBalancer”, 将为 Service 提供负载均衡器。 负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过 Service 的 status.loadBalancer 字段发布出去。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8888
clusterIP: 10.106.168.53
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.168.0.88
来自外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。
某些云提供商允许设置 loadBalancerIP
。 在这些情况下,将根据用户设置的 loadBalancerIP
来创建负载均衡器。 如果没有设置 loadBalancerIP
字段,将会给负载均衡器指派一个临时 IP。 如果设置了 loadBalancerIP
但云提供商并不支持这种特性,那么设置的 loadBalancerIP
值将会被忽略掉。
ExternalIP示例
若是外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。经过外部 IP(做为目的 IP 地址)进入到集群,打到 Service 端口上的流量,将会被路由到 Service 的 Endpoint 上。
externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴。
根据 Service 的规定,externalIPs 能够同任意的 ServiceType 来一块儿指定。在下面的例子中,my-service 能够在【模拟外网IP】“10.0.0.240”(externalIP:port) 上被客户端访问。
//查看状态文件
[root@master manifes]# cat network.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: v1
template:
metadata:
labels:
app: myapp
release: v1
spec:
containers:
- name: myapp
image: linlusama/apache:v2
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: myapp-nodeport
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: v1
ports:
- name: httpd
port: 80
targetPort: 80
externalIPs:
- 10.0.0.240
//查看pods状态
[root@master manifes]# kubectl apply -f network.yaml
deployment.apps/myapp-deploy unchanged
service/myapp-nodeport configured
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/myapp-deploy-6bc687c6f5-8xh6x 1/1 Running 0 16m
pod/myapp-deploy-6bc687c6f5-jgw95 1/1 Running 0 16m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
service/myapp-nodeport NodePort 10.106.168.53 10.0.0.240 80:30923/TCP 14m
//访问
[root@master manifes]# curl 10.106.168.53
<html><body><h1>It works!</h1></body></html>
[root@master manifes]# curl 10.0.0.240
<html><body><h1>It works!</h1></body></html>
案列
1.创建一个 deployment 副本数 3 ,然后滚动更新镜像版本,并记录这个更新记录,最后再回滚到上一个版本
[root@master manifes]# kubectl get pods,svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
[root@master manifes]# vi test.yaml
[root@master manifes]# cat test.yaml
---
piVersion: apps/v1
kind: Deployment
metadata:
name: test1
labels:
app: test1
spec:
replicas: 3
selector:
matchLabels:
app: test1
template:
metadata:
labels:
app: test1
spec:
containers:
- image: linlusama/apache:v2
name: test1
imagePullPolicy: IfNotPresent
[root@master manifes]# kubectl apply -f test.yaml
deployment.apps/test1 created
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-7f6d7d697-bdjj9 1/1 Running 0 23s
pod/test1-7f6d7d697-ktns6 1/1 Running 0 23s
pod/test1-7f6d7d697-rgnxt 1/1 Running 0 23s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
升级
[root@master manifes]# kubectl set image deploy/test1 test1=linlusama/httpd:v2
deployment.apps/test1 image updated
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-6fc575988c-gmghf 0/1 ContainerCreating 0 1s
pod/test1-6fc575988c-zf4nl 1/1 Running 0 2s
pod/test1-7f6d7d697-bdjj9 1/1 Terminating 0 2m25s
pod/test1-7f6d7d697-ktns6 1/1 Running 0 2m25s
pod/test1-7f6d7d697-rgnxt 1/1 Running 0 2m25s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
回滚
[root@master manifes]# kubectl rollout history deploy test1
deployment.apps/test1
REVISION CHANGE-CAUSE
1 <none>
2 <none>
[root@master manifes]# kubectl rollout history deploy test1 --revision=2
deployment.apps/test1 with revision #2
Pod Template:
Labels: app=test1
pod-template-hash=6fc575988c
Containers:
test1:
Image: linlusama/httpd:v2
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
[root@master manifes]# kubectl rollout undo deploy test1
deployment.apps/test1 rolled back
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-6fc575988c-gmghf 1/1 Running 0 96s
pod/test1-6fc575988c-rzxtj 1/1 Terminating 0 95s
pod/test1-6fc575988c-zf4nl 1/1 Running 0 97s
pod/test1-7f6d7d697-k452p 0/1 ContainerCreating 0 1s
pod/test1-7f6d7d697-ktns6 0/1 Terminating 0 4m
pod/test1-7f6d7d697-wr9lt 1/1 Running 0 3s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
2.给一个应用扩容副本数为 3
[root@master manifes]# kubectl scale --replicas 3 deploy/test1
deployment.apps/test1 scaled
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-7f6d7d697-bvf56 1/1 Running 0 109s
pod/test1-7f6d7d697-k452p 1/1 Running 0 110s
pod/test1-7f6d7d697-wr9lt 1/1 Running 0 112s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
[root@master manifes]# kubectl scale --replicas 3 deploy/test1
deployment.apps/test1 scaled
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-7f6d7d697-bvf56 1/1 Running 0 109s
pod/test1-7f6d7d697-k452p 1/1 Running 0 110s
pod/test1-7f6d7d697-wr9lt 1/1 Running 0 112s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d16h
3.创建一个pod,其中运行着nginx、redis、mamcached 3个容器
[root@master manifes]# vi test2.yaml
[root@master manifes]# cat test2.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: test2
labels:
app: test2
spec:
containers:
- image: nginx
name: nginx
- image: redis
name: redis
- image: memcached
name: memcached
[root@master manifes]# kubectl apply -f test2.yaml
pod/test2 created
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-7f6d7d697-bvf56 1/1 Running 0 4m9s
pod/test1-7f6d7d697-k452p 1/1 Running 0 4m10s
pod/test1-7f6d7d697-wr9lt 1/1 Running 0 4m12s
pod/test2 0/3 ContainerCreating 0 4s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d17h
4.给一个pod创建service,并可以通过ClusterIP/NodePort访问
[root@master manifes]# vi test3.yaml
[root@master manifes]# cat test3.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: test3
labels:
app: test3
spec:
containers:
- image: nginx
name: nginx
---
apiVersion: v1
kind: Service
metadata:
name: test3
spec:
ports:
- port: 80
targetPort: 80
nodePort: 31888
selector:
app: test3
type: NodePort
[root@master manifes]# kubectl apply -f test3.yaml
pod/test3 created
service/test3 created
[root@master manifes]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/test1-7f6d7d697-bvf56 1/1 Running 0 5m35s
pod/test1-7f6d7d697-k452p 1/1 Running 0 5m36s
pod/test1-7f6d7d697-wr9lt 1/1 Running 0 5m38s
pod/test2 0/3 ContainerCreating 0 90s
pod/test3 0/1 ContainerCreating 0 3s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d17h
service/test3 NodePort 10.96.151.113 <none> 80:31888/TCP 3s
[root@master manifes]# curl 10.96.151.113
<!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>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master manifes]# curl 192.168.200.150:31888
<!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>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
5.创建deployment和service,使用busybox容器nslooup解析service
[root@master manifes]# kubectl run test4 --image busybox -- sleep 9000
pod/test4 created
[root@master manifes]# kubectl exec -it test4 -- /bin/sh
/ # nslookup kubernetes
Server: 10.96.0.10
Address: 10.96.0.10:53
** server can't find kubernetes.default.svc.cluster.local: NXDOMAIN
*** Can't find kubernetes.svc.cluster.local: No answer
*** Can't find kubernetes.cluster.local: No answer
*** Can't find kubernetes.localdomain: No answer
*** Can't find kubernetes.default.svc.cluster.local: No answer
*** Can't find kubernetes.svc.cluster.local: No answer
*** Can't find kubernetes.cluster.local: No answer
*** Can't find kubernetes.localdomain: No answer
/ #