真题解析
题目:
请重新配置现有的deployment front-end以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。
创建一个名为 front-end-svc 的新 service,以公开容器端口 http。
配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。
考察点:
将现有的 deployment 暴露成 nodeport 的 service 。
解析:
- 首先需要明确的是deployment front-end已经存在,需要我们在已存在的基础上添加名称为http的端口规范。
- 新创建一个名称为front-end-svc 的 service 来暴露前面添加的http端口规范。
- service需要创建成nodeport的形式。
帮助文档:
关于service可以查阅官方文档。
https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
实际操作:
- 在已部署的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
字段对要暴露的端口进行公开。
- 创建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:目标端口
检查验证:
- 检查是否创建成功
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
...
- 检查能否访问
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
。
至此本题解析完成。