江小南

V1

2022/10/23阅读:53主题:默认主题

【CKA、CKS篇】CKA真题解析——暴露服务 service

真题解析

题目

请重新配置现有的deployment front-end以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。

创建一个名为 front-end-svc 的新 service,以公开容器端口 http。

配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。

考察点

将现有的 deployment 暴露成 nodeport 的 service 。

解析

  1. 首先需要明确的是deployment front-end已经存在,需要我们在已存在的基础上添加名称为http的端口规范。
  2. 新创建一个名称为front-end-svc 的 service 来暴露前面添加的http端口规范。
  3. service需要创建成nodeport的形式。

帮助文档

关于service可以查阅官方文档。

https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

实际操作

  1. 在已部署的deployment front-end上添加http端口规范。
kubectl edit deploy front-end
apiVersion: apps/v1
kind: Deployment
...
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: front-end
    spec:
      containers:
      - image: vicuu/nginx:hello
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
...

说明:添加公开端口规范其实就是在yaml中添加ports字段对要暴露的端口进行公开。

  1. 创建service
candidate@node01:~$ kubectl expose deploy front-end --name=front-end-svc --type=NodePort --port=80 --target-port=80
service/front-end-svc exposed
candidate@node01:~$

说明:

--type: 类型。有NodePort和ClusterIP两种。

--port:暴露的端口。

--target-port:目标端口

检查验证

  1. 检查是否创建成功
candidate@node01:~$ kubectl get svc front-end-svc -o wide
NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE    SELECTOR
front-end-svc   NodePort   10.97.80.39   <none>        80:31016/TCP   106s   app=front-end
candidate@node01:~$ kubectl get deploy front-end -o wide
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES              SELECTOR
front-end   1/1     1            1           38d   nginx        vicuu/nginx:hello   app=front-end
candidate@node01:~$

说明:这里我们要看service的selector 标签和deployment的selector标签是否一致,如果service是<none>或者为空,需要手动编辑yaml进行修改,如下所示selector部分:

kubectl edit svc front-end-svc
apiVersion: v1
kind: Service
...
  ports:
  - nodePort: 31016
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: front-end
  sessionAffinity: None
  type: NodePort
...
  1. 检查能否访问
candidate@node01:~$ kubectl get pod,svc -o wide
NAME                                READY   STATUS    RESTARTS      AGE   IP               NODE     NOMINATED NODE   READINESS GATES
pod/11-factor-app                   1/1     Running   6 (34m ago)   38d   10.244.196.170   node01   <none>           <none>
pod/foo                             1/1     Running   6 (34m ago)   38d   10.244.140.106   node02   <none>           <none>
pod/front-end-567955846c-j8p68      1/1     Running   0             27m   10.244.140.110   node02   <none>           <none>
pod/presentation-5f64bd874c-68z8p   1/1     Running   6 (34m ago)   38d   10.244.140.107   node02   <none>           <none>

NAME                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/front-end-svc   NodePort    10.97.80.39   <none>        80:31016/TCP   16m   app=front-end
service/kubernetes      ClusterIP   10.96.0.1     <none>        443/TCP        40d   <none>
candidate@node01:~$
# curl 所在的 node 的 ip 或主机名:31016
candidate@node01:~$ curl node02:31016
Hello World ^_^
candidate@node01:~$
# curl svc 的 ip 地址:80
candidate@node01:~$ curl 10.97.80.39:80
Hello World ^_^
candidate@node01:~$
# 在容器内使用域名:80
candidate@node01:~$ kubectl exec -it front-end-567955846c-j8p68 -- /bin/bash
root@front-end-567955846c-j8p68:/# curl front-end-svc.default.svc:80
Hello World ^_^
root@front-end-567955846c-j8p68:/#

说明:

域名的形式:service名称.名称空间.svc

至此本题解析完成。

分类:

后端

标签:

后端

作者介绍

江小南
V1