备战CKA: 暴露服务 service|创建 Ingress|扩容 deployment 副本数量

127 阅读3分钟

 暴露服务 service

Task

请重新配置现有的deployment front-end 以及添加名为http的端口规范来公开现有容器 nginx 的端口80/tcp。 创建一个名为front-end-svc的新service,以公开容器端口http。 配置此service,以通过各个Pod所在的节点上的 NodePort 来公开他们。


参考:

概念 --> 工作负载 --> 工作负载资源 --> Deployments kubernetes.io/zh-cn/docs/…

解答:

image.png

检查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的容器的端口号

说明

  1. Deployment 配置

    • 在 Deployment 的 template.spec.containers 下添加一个端口规范 ports,名称为 http,端口号为 80,协议为 TCP
  2. Service 配置

    • type 设置为 NodePort,使得服务可以通过节点上的端口暴露。
    • selector 部分指定了服务选择器,匹配带有标签 app: front-end 的 Pods。
    • ports 部分定义了服务端口 80,目标端口 targetPort 设置为 http(与 Deployment 中的端口名称对应),并且通过 nodePort 明确指定一个 NodePort(例如 30001)。

image.png

检查:

暴露服务后,检查一下service的selector标签是否正确,这个要与deployment的selector标签一致

kubectl get svc front-end-svc -o wide 
kubectl get deployment front-end -o wide

image.png

如果你kubectl expose暴露服务后,发现service的selector标签是空的,或者不是deployment的,如下图这样:

image.png

则需要编辑此service,手动添加标签

kubectl edit svc front-end-svc

在ports这一小段下面添加selector标签 selector: app: front-end #注意yaml里是写冒号,而不是等号,不是app=front-end

image.png

确保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/…


解答:

image.png

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

说明

  1. 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/…

解答:

image.png

#检查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