赞
踩
1、使用Deployment管理pod
通常来说,在编写yml 时,Pod与Deployment 成对出现。因为弹性伸缩的需要,Deployment 扮演着Pod 的监管者角色。仅仅通过Deployment配置文件就可以启动pod,所以不需要单独写pod的配置文件。如何系统中已经存在对应的pod,Deployment会根据matchLabels标签选择匹配上pod,纳入到自己的管理中。
- apiVersion: apps/v1 #这里要注意了,单独创建Pod时是v1,换成Deployment后,这里要改写为apps/v1
- kind: Deployment #指定要创建的类型
- metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
- name: k3s-test #deployment 的名称
- labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
- app: k3s-test #app 为key ,k3s-test 为value,还可以定义多个
- spec: #这里开始就是Deployment的属性配置了
- replicas: 3 #指定Pod的数量
- selector: #标签选择器,与上面的标签共同作用,目前不需要理解
- matchLabels: #选择包含标签app:k3s-test-pod的资源
- app: k3s-test-pod
- template:
- template: #Pod模板
- metadata:
- labels: #Pod的标签,上面的selector即选择包含标签app:k3s-test-pod的Pod
- app: k3s-test-pod
- spec: #期望Pod实现的功能(即在pod中部署)
- containers: #容器信息
- - name: test
- image: hello-world-app:latest #还是我们的Node Demo
- imagePullPolicy: Never
- ports: #这里代表Pod 可输出的端口,7001是我们Node Demo 默认可访问的端口
- - containerPort: 3000
执行完上述命令后,我们在输出终端也看到有一个Pod 被创建出来,IP地址为10.42.0.34
。这个IP地址如Kubernetes(k3s)学习(二) -- 基于最小的pod单元来创建应用所讲,只允许被Kubenetes 内部环境所访问,外网不能正常访问。
- #在server 节点访问的结果
- ubuntu@server:~$ curl http://10.42.0.34:3000
- #输出
- Hello, World!
-
-
-
- #在本机外正常环境的访问(如浏览器)
- #输出
- curl http://10.42.0.34:3000
-
- #输出
- #没有结果
怎样才能让外界能够访问容器呢?
在 Kubernetes 中,Service
是一种抽象,它定义了一组 Pod 的访问策略。Service
有多种类型,其中 ClusterIP
和 NodePort
是最常用的两种类型。它们的主要区别在于暴露服务的方式和访问范围。
- apiVersion: v1 #apiVersion 需要回到v1 命名
- kind: Service #指定要创建的类型
- metadata:
- name: k3s-test-service
- labels:
- app: k3s-test-pod
- spec:
- selector: #选择器,需要与pod 的命名是一致
- app: k3s-test-pod
- type: NodePort #先介绍NodePort,后面再介绍ClusterIp
- ports:
- - name: k3s-test-service-port
- protocol: TCP
- port: 80
- nodePort: 31000
- targetPort: 3000
-
- #targetPort: 要映射去Pod 的可访问端口
- #port: Kubenetes 内部环境可访问的端口
- #nodePort : 外部环境可访问,但Kubenetes内部环境不能访问的端口。
- #如果不指定,将由Kubenetes 自动分配端口
执行kubectl 的通用命令
- ubuntu@server:~$ sudo kubectl apply -f create-service.yml
-
- #输出内容
- service/k3s-test-service created
-
- #通过命令检查是否创建成功
- ubuntu@server:~$ sudo kubectl get services -o wide
-
- #得到的输出结果
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- k3s-test-service NodePort 10.43.190.140 <none> 80:31000/TCP 4m32s app=k3s-test
- kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 9d <none>
验证测试,service中80是kubenetes 内部环境通过service ip可访问的端口,31000是外部环境可访问,但Kubenetes内部环境不能访问的端口。
- #通过service的ip允许直接访问80端口
- ubuntu@server:~$ curl http://10.43.190.140
- #输出
- Hello, World!
-
-
- #不允许访问31000端口,因为该端口是给外部访问的
- ubuntu@server:~$ curl http://10.43.190.140:31000
- #没有输出,不允许访问31000端口
-
-
- #直接输入pod的ip访问也是可以的。(先查找pod的ip地址,3000是pod中容器应用的端口)
- ubuntu@node1:~$ curl http://10.42.0.34:3000
-
-
-
- #外部环境
- #其中192.168.110.45是server节点的IP地址,
- #31000端口对外暴露输出,在浏览器中输入http://192.168.110.45:31000/
- #正常输出 :Hello, World!
Service 除了NodePort类型外默认选择是ClusterIp。ClusterIp其区别在于不能定义对外暴露端口
。实际项目执行中,我偏向于使用Cluster类型,减少Master节点被过多暴露端口。
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 和服务是否正常运行:
- kubectl get pods -n ingress-nginx
- kubectl get svc -n ingress-nginx
你应该能看到 ingress-nginx-controller
服务正在运行。
注意上面的ingress-nginx-contorller的TYPE为NodePort类型
3)配置 Ingress 规则:
创建一个示例 Ingress 规则来验证配置。可以使用以下 YAML 文件定义一个简单的 Ingress 规则:
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: my-ingress
- annotations:
- kubernetes.io/ingress.class: nginx
- nginx.ingress.kubernetes.io/rewrite-target: /
- spec:
- rules:
- - host: retrieval.com #这里是外界入口可访问的域名配置
- http:
- paths:
- - pathType: Prefix
- path: "/app1" #可配置访问的入口路径
- backend:
- service:
- name: k3s-test-service #选择器,代表访问Service:k3s-test-service
- port:
- number: 80 #对外暴露的端口
4)应用这个 Ingress 规则:
kubectl apply -f your-ingress.yaml
查看ingress的类型和信息
记得根据实际情况调整 host
和 service
名称。
- #返回到本机的“终端”
- # 修改linux服务器上的hosts
- sudo vi /etc/hosts
- # 在该文件中添加一条解析记录
- 192.168.110.45 retrieval.com
-
- #如果要在浏览器中能正常访问,也需要配置windons上的hosts文件
- #导航到 C:\Windows\System32\drivers\etc\ 文件夹。在 hosts 文件中,你可以添加新的条目。
-
- 192.168.110.45 retrieval.com
5)验证:
更多请参考:Kubernetes(k3s)基础学习(三) -- Deployment、Service、Ingress - 简书
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。