暴露服务 service
Task
请重新配置现有的deployment front-end 以及添加名为http的端口规范来公开现有容器 nginx 的端口80/tcp。 创建一个名为front-end-svc的新service,以公开容器端口http。 配置此service,以通过各个Pod所在的节点上的 NodePort 来公开他们。
参考:
概念 --> 工作负载 --> 工作负载资源 --> Deployments kubernetes.io/zh-cn/docs/…
解答:
检查deployment信息,并记录SELECTOR的Lable标签,这里是app=front-end
kubectl get deployment front-end -o wide
编辑 front-end
kubectl edit deployment front-end
spec下 name:nginx 行后添加
ports:
- name: http
containerPort: 80
protocol: TCP
暴露端口:
kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
# 注意考试中需要创建的是NodePort,还是ClusterIP。如果是ClusterIP,则应为--type=ClusterIP # --port是service的端口号 # --target-port是deployment里pod的容器的端口号
说明
-
Deployment 配置:
- 在
Deployment
的template.spec.containers
下添加一个端口规范ports
,名称为http
,端口号为80
,协议为TCP
。
- 在
-
Service 配置:
type
设置为NodePort
,使得服务可以通过节点上的端口暴露。selector
部分指定了服务选择器,匹配带有标签app: front-end
的 Pods。ports
部分定义了服务端口80
,目标端口targetPort
设置为http
(与 Deployment 中的端口名称对应),并且通过nodePort
明确指定一个 NodePort(例如30001
)。
检查:
暴露服务后,检查一下service的selector标签是否正确,这个要与deployment的selector标签一致
kubectl get svc front-end-svc -o wide
kubectl get deployment front-end -o wide
如果你kubectl expose暴露服务后,发现service的selector标签是空的,或者不是deployment的,如下图这样:
则需要编辑此service,手动添加标签
kubectl edit svc front-end-svc
在ports这一小段下面添加selector标签 selector: app: front-end #注意yaml里是写冒号,而不是等号,不是app=front-end
确保service的selector标签与deployment的selector标签一致
kubectl get pod,svc -o wide
curl 所在的node的ip或主机名:30xxx curl svc的ip地址:80
创建 Ingress
Task
如下创建一个新的nginx Ingress资源: 名称: ping Namespace: ing-internal 使用服务端口 5678在路径 /hello 上公开服务 hello 可以使用以下命令检查服务 hello的可用性,该命令应返回 hello: curl -kL INTERNAL_IP/hello
参考:
概念 --> 服务、负载均衡和联网 --> Ingress kubernetes.io/zh-cn/docs/… kubernetes.io/zh-cn/docs/…
解答:
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example #考试时没有ingressClassName手动创建一个
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ping
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
说明
-
Ingress 配置:
-
metadata
部分设置了 Ingress 的名称ping
和命名空间ing-internal
。 -
annotations
部分添加了一个注解nginx.ingress.kubernetes.io/rewrite-target: /$1
,用于重写请求路径。 -
spec
部分定义了 Ingress 的规则。rules
部分定义了一个 HTTP 规则。paths
部分定义了路径/hello
,并将其映射到服务hello
的端口 5678。
-
kubectl apply -f ingress.yaml
检查:
kubectl get ingress -n ing-internal
curl ingressIP/hello
扩容 deployment 副本数量
Task
将 deployment presentation 扩展至 4个 pods
参考:
kubectl scale deployment -h kubernetes.io/zh-cn/docs/…
解答:
#检查pod数量和运行情况
kubectl get deployments presentation -o wide
kubectl get pod -l app=presentation
#扩展数量
kubectl scale deployment presentation --replicas=4
检查:
kubectl get deployments presentation -o wide
kubectl get pod -l app=presentation
验证
查看 Deployment
状态:
kubectl get deployment presentation -n my-app
plaintext
NAME READY UP-TO-DATE AVAILABLE AGE
presentation 4/4 4 4 1h
查看 Pods
状态:
kubectl get pods -n my-app
输出应该显示有 4 个 Pod
处于 Running
状态。
示例输出:
plaintext
NAME READY STATUS RESTARTS AGE
presentation-6b7cb985d5-jmz5p 1/1 Running 0 1h
presentation-6b7cb985d5-k6v4j 1/1 Running 0 1h
presentation-6b7cb985d5-l7r2q 1/1 Running 0 1h
presentation-6b7cb985d5-x2t4m 1/1 Running 0