当前位置:   article > 正文

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

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 - 简书

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/963585
推荐阅读
相关标签
  

闽ICP备14008679号