Kubernetes Service 对外暴露与应用

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

/ # 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值