• Kubernetes(k3s)基础学习(三) -- Deployment、Service、Ingress


    1、使用Deployment管理pod

    通常来说,在编写yml 时,Pod与Deployment 成对出现。因为弹性伸缩的需要,Deployment 扮演着Pod 的监管者角色。仅仅通过Deployment配置文件就可以启动pod,所以不需要单独写pod的配置文件。如何系统中已经存在对应的pod,Deployment会根据matchLabels标签选择匹配上pod,纳入到自己的管理中。

    1. apiVersion: apps/v1 #这里要注意了,单独创建Pod时是v1,换成Deployment后,这里要改写为apps/v1
    2. kind: Deployment #指定要创建的类型
    3. metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
    4. name: k3s-test #deployment 的名称
    5. labels: #标签,可以灵活定位一个或多个资源,其中keyvalue均可自定义,可以定义多组,目前不需要理解
    6. app: k3s-test #app 为key ,k3s-test 为value,还可以定义多个
    7. spec: #这里开始就是Deployment的属性配置了
    8. replicas: 3 #指定Pod的数量
    9. selector: #标签选择器,与上面的标签共同作用,目前不需要理解
    10. matchLabels: #选择包含标签app:k3s-test-pod的资源
    11. app: k3s-test-pod
    12. template:
    13. template: #Pod模板
    14. metadata:
    15. labels: #Pod的标签,上面的selector即选择包含标签app:k3s-test-pod的Pod
    16. app: k3s-test-pod
    17. spec: #期望Pod实现的功能(即在pod中部署)
    18. containers: #容器信息
    19. - name: test
    20. image: hello-world-app:latest #还是我们的Node Demo
    21. imagePullPolicy: Never
    22. ports: #这里代表Pod 可输出的端口,7001是我们Node Demo 默认可访问的端口
    23. - containerPort: 3000

    执行完上述命令后,我们在输出终端也看到有一个Pod 被创建出来,IP地址为10.42.0.34

    。这个IP地址如Kubernetes(k3s)学习(二) -- 基于最小的pod单元来创建应用所讲,只允许被Kubenetes 内部环境所访问,外网不能正常访问。

    1. #在server 节点访问的结果
    2. ubuntu@server:~$ curl http://10.42.0.34:3000
    3. #输出
    4. Hello, World!
    5. #在本机外正常环境的访问(如浏览器)
    6. #输出
    7. curl http://10.42.0.34:3000
    8. #输出
    9. #没有结果

    怎样才能让外界能够访问容器呢?

    2、使用Service

    Kubernetes 中,Service 是一种抽象,它定义了一组 Pod 的访问策略。Service 有多种类型,其中 ClusterIPNodePort 是最常用的两种类型。它们的主要区别在于暴露服务的方式和访问范围。

    1. apiVersion: v1 #apiVersion 需要回到v1 命名
    2. kind: Service #指定要创建的类型
    3. metadata:
    4. name: k3s-test-service
    5. labels:
    6. app: k3s-test-pod
    7. spec:
    8. selector: #选择器,需要与pod 的命名是一致
    9. app: k3s-test-pod
    10. type: NodePort #先介绍NodePort,后面再介绍ClusterIp
    11. ports:
    12. - name: k3s-test-service-port
    13. protocol: TCP
    14. port: 80
    15. nodePort: 31000
    16. targetPort: 3000
    17. #targetPort: 要映射去Pod 的可访问端口
    18. #port: Kubenetes 内部环境可访问的端口
    19. #nodePort : 外部环境可访问,但Kubenetes内部环境不能访问的端口。
    20. #如果不指定,将由Kubenetes 自动分配端口

    执行kubectl 的通用命令

    1. ubuntu@server:~$ sudo kubectl apply -f create-service.yml
    2. #输出内容
    3. service/k3s-test-service created
    4. #通过命令检查是否创建成功
    5. ubuntu@server:~$ sudo kubectl get services -o wide
    6. #得到的输出结果
    7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    8. k3s-test-service NodePort 10.43.190.140 <none> 80:31000/TCP 4m32s app=k3s-test
    9. kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 9d <none>

    验证测试,service中80是kubenetes 内部环境通过service ip可访问的端口,31000是外部环境可访问,但Kubenetes内部环境不能访问的端口。

    1. #通过service的ip允许直接访问80端口
    2. ubuntu@server:~$ curl http://10.43.190.140
    3. #输出
    4. Hello, World!
    5. #不允许访问31000端口,因为该端口是给外部访问的
    6. ubuntu@server:~$ curl http://10.43.190.140:31000
    7. #没有输出,不允许访问31000端口
    8. #直接输入pod的ip访问也是可以的。(先查找pod的ip地址,3000是pod中容器应用的端口)
    9. ubuntu@node1:~$ curl http://10.42.0.34:3000
    10. #外部环境
    11. #其中192.168.110.45是server节点的IP地址,
    12. #31000端口对外暴露输出,在浏览器中输入http://192.168.110.45:31000/
    13. #正常输出 :Hello, World!

    Service 除了NodePort类型外默认选择是ClusterIpClusterIp其区别在于不能定义对外暴露端口

    。实际项目执行中,我偏向于使用Cluster类型,减少Master节点被过多暴露端口。

    3、服务发布

    Kubenetes 提供了一种基于 Ingress 的服务发布式,通过配置 Ingress 和外部实现的 Ingress Controller 可以方便的实现服务发布的功能。k3s 默认集成了基于 Traefix 的 Ingress Controller,但是下面我们使用ingress-nginx作为Ingress Controller。

    要在 k3s 上安装 ingress-nginx,可以按照以下步骤进行操作:

    1)部署 ingress-nginx:

    使用 kubectl 执行以下命令部署 ingress-nginx。k3s 默认启用了内置的 traefik 作为 ingress 控制器,但你可以安装 nginx-ingress 作为替代。

    wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

    修改下载的deploy.yaml配置文件,把其中的type:Loadblance修改为NodePort,并且该ingree-nginx暴露的端口http为30080和https为30443。

    运行yaml文件

    kubectl apply -f deploy.yaml

    2)验证部署:

    部署完成后,你可以检查 ingress-nginx 的 Pods 和服务是否正常运行:

    1. kubectl get pods -n ingress-nginx
    2. kubectl get svc -n ingress-nginx

    你应该能看到 ingress-nginx-controller 服务正在运行。

    注意上面的ingress-nginx-contorller的TYPE为NodePort类型

    3)配置 Ingress 规则:

    创建一个示例 Ingress 规则来验证配置。可以使用以下 YAML 文件定义一个简单的 Ingress 规则:

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: my-ingress
    5. annotations:
    6. kubernetes.io/ingress.class: nginx
    7. nginx.ingress.kubernetes.io/rewrite-target: /
    8. spec:
    9. rules:
    10. - host: retrieval.com #这里是外界入口可访问的域名配置
    11. http:
    12. paths:
    13. - pathType: Prefix
    14. path: "/app1" #可配置访问的入口路径
    15. backend:
    16. service:
    17. name: k3s-test-service #选择器,代表访问Service:k3s-test-service
    18. port:
    19. number: 80 #对外暴露的端口

    4)应用这个 Ingress 规则:

    kubectl apply -f your-ingress.yaml

    查看ingress的类型和信息

    记得根据实际情况调整 hostservice 名称。

    1. #返回到本机的“终端”
    2. # 修改linux服务器上的hosts
    3. sudo vi /etc/hosts
    4. # 在该文件中添加一条解析记录
    5. 192.168.110.45 retrieval.com
    6. #如果要在浏览器中能正常访问,也需要配置windons上的hosts文件
    7. #导航到 C:\Windows\System32\drivers\etc\ 文件夹。在 hosts 文件中,你可以添加新的条目。
    8. 192.168.110.45 retrieval.com

    5)验证:

    更多请参考:Kubernetes(k3s)基础学习(三) -- Deployment、Service、Ingress - 简书

  • 相关阅读:
    从零开始Blazor Server(11)--编辑用户
    两个输入数组的非单一维度必须相互匹配
    React高手必学:自定义Hooks,轻松飞升技术巅峰!
    SRC逻辑漏洞 hackinglab11 身份验证PkavHttpfuzzer验证码爆破
    二叉树的基本性质与遍历
    【算法与数据结构】--高级算法和数据结构--高级数据结构
    《论语译注》笔记
    Desthiobiotin-PEG4-Acid|脱硫生物素-PEG4-酸| 供应商和制造商
    《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组稀疏矩阵
    C#获取http请求的JSON数据并解析
  • 原文地址:https://blog.csdn.net/weixin_42670590/article/details/141086224