容器集群
强烈建议先看镜像制作篇,该篇章为本篇的前置内容配合食用效果更佳。 传送门*
1. 查看VM上的Kubernetes访问的配置文件Kube config文件
/home/ubuntu/.kube下的文件config就是Kubernetes访问的配置文件。在VS Code中打开这个文件。
kubeconfig 文件是 Kubernetes 用来保存集群、用户、命名空间和认证信息的配置文件。这个文件使得 kubectl 和其他 Kubernetes 客户端能够知道如何访问和认证到 Kubernetes 集群。以下是 kubeconfig 文件的关键组成部分和它们的作用:
1. clusters:
这部分定义了一个或多个集群的信息,包括每个集群的名字和 Kubernetes API 服务器的地址。通常还包含了用于建立安全连接的证书信息,比如 CA(证书颁发机构)的证书。
2. contexts:
context 将集群、用户和命名空间组合在一起,这样你就可以快速切换到不同的集群或命名空间。它包括引用集群、用户凭证和默认命名空间的名称。
3. users:
这部分包含了连接到 Kubernetes 集群所需的用户认证信息。这可能包括用户名和密码、客户端证书和密钥,或其他身份验证机制(如 token 或 Kerberos)的详细信息。
4. Namespace:
在 Kubernetes 中,命名空间(Namespace)是一种将集群中的资源划分为多个逻辑分区的方法。这种机制使得多个团队或项目能够在同一个物理集群上共存,而彼此之间又相对隔离,保证了资源的组织和安全性。
2. 在集群上创建属于自己的namespace
kubectl create namespace {取命名空间}
3. 在集群上创建容器注册表机密
kubectl create secret docker-registry {取一个机密代号} --docker-server={注册表服务器} --docker-username={注册表用户名} --docker-password={注册表密码} --namespace={命名空间}
4. 部署pod
4.1 创建部署pod的yaml文件(XXX.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {取个名来标识是针对的同种应用}
name: {取个部署名,本质是模版,部署后有个运行名需要查看}
namespace: {集群命名空间}
spec:
replicas: 1
selector:
matchLabels:
app: {metadata.labels.app}
template:
metadata:
labels:
app: {metadata.labels.app}
spec:
containers:
- image: {容器镜像位置}
name: {3}
ports:
- containerPort: {制作镜像时的监听窗口}
imagePullSecrets:
- name: {注册表机密代号}
pod是Kubernetes中最小的部署单元,它可以包含一个或多个容器。这个文件的参数含义如下:
- apiVersion: apps/v1:这是指定Kubernetes API的版本,apps/v1是用来管理部署对象的API。
- kind: Deployment:这是指定要创建的对象的类型,Deployment是一种控制器,它可以管理pod的生命周期,比如创建、更新、删除等。
- metadata:这是指定对象的元数据,比如名称、标签、命名空间等。
- labels:给pod分类,贴标签,利于使用k8s进行管理
- name:这是指定对象的名称,这里的{3}是一个占位符,可以替换成任意字符串。
- namespace:这是指定对象所属的命名空间,命名空间是一种逻辑分组,可以用来隔离不同的对象。这里的{0}是一个占位符,可以替换成任意字符串。
- spec:这是指定对象的规格,比如要部署的pod的数量、模板等。
- replicas:这是指定要部署的pod的数量,这里的1表示只部署一个pod。
- selector:这是指定要管理的pod的选择器,它是一种键值对,可以用来匹配和筛选pod。这里的matchLabels表示要匹配的是标签,app:
{1}表示要匹配的标签是app,值是{1},这意味着这个部署对象只会管理标签为app:{1}的pod。- template:这是指定要部署的pod的模板,它包含了pod的元数据和规格。
- metadata:这是指定pod的元数据,比如标签等。这里的app: {1}表示这个pod的标签是app,值是{1},这样就可以和部署对象的选择器匹配。
- spec:这是指定pod的规格,比如要运行的容器等。
- containers:这是指定pod中要运行的容器的列表,每个容器都有一个名称、一个镜像、一个或多个端口等。
- image:这是指定容器要运行的镜像,镜像是一种包含了应用程序和依赖的文件系统。这里的{4}是一个占位符,可以替换成任意字符串,比如nginx:latest表示要运行最新版本的nginx镜像。
- name:这是指定容器的名称,这里的{3}是一个占位符,可以替换成任意字符串,比如web表示这个容器的名称是web。
- ports:这是指定容器要暴露的端口的列表,每个端口都有一个容器端口号,可以用来访问容器内的服务。这里的{容器窗口}是一个占位符,可以替换成任意数字,比如80表示这个容器要暴露80端口。
- imagePullSecrets:这是指定拉取镜像时要使用的机密的列表,机密是一种存储敏感信息的对象,比如用户名、密码等。这里的{注册表机密代号}是一个占位符,可以替换成任意字符串,比如mysecret表示要使用名为mysecret的机密来拉取镜像。
4.2 部署pod命令
kubectl apply -f {XXX.yaml}
查看结果,的部署运行的名字,从中拷贝出pod名称
kubectl get pods -n {给pod分配的命名空间}
4.3 通过使用kubectl 转发端口查看自己的应用
kubectl port-forward {运行时的pod的名字} -n {pod所属命名空间} {本地窗口}:{镜像监听端口}
5. 创建服务文件myingress.yaml
---
apiVersion: v1
kind: Service
metadata:
name: ai-front
namespace: {已经存在的命名空间}
spec:
ports:
- port: {随意端口}
selector:
app: {要绑定的pod的标签}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: in-scuapps-u0apps-{你的学号}
namespace: {已经存在的的命名空间}
spec:
rules:
- host: {你注册的主机}
http:
paths:
- path: /{路径}
pathType: Prefix
backend:
service:
name: ai-front
port:
number: {和服务中的端口一致}
这个yaml的特殊之处是它定义了两种不同的对象,一种是服务(Service),一种是入口(Ingress)。服务和入口都是用来访问pod的对象,但是它们有一些区别:
服务是一种内部的访问对象,它可以提供一个稳定的访问地址和端口来访问一组pod,但是它只能在Kubernetes集群内部被访问,不能被外部的用户或系统访问。
入口是一种外部的访问对象,它可以提供一个外部的访问地址和路径来路由请求到不同的服务,但是它需要一个入口控制器(Ingress Controller)来实现,入口控制器是一种负责接收和转发请求的组件,比如nginx或traefik等。
这个文件的字段含义如下:
apiVersion: v1:这是指定Kubernetes API的版本,v1是用来管理服务对象的API。
kind: Service:这是指定要创建的对象的类型,Service是一种对象,它可以提供一个稳定的访问地址和端口来访问一组pod。
metadata:这是指定对象的元数据,比如名称、命名空间等。
- name:这是指定对象的名称,这里的ai-front表示这个服务的名称是ai-front。
- namespace:这是指定对象所属的命名空间,这里的{你的命名空间}是一个占位符,可以替换成任意字符串,比如my-namespace。
spec:这是指定对象的规格,比如要提供的端口、要选择的pod等。
- ports:这是指定服务要提供的端口的列表,每个端口都有一个端口号,可以用来访问服务内的pod。
- port:这是指定服务要提供的端口号,这里的{5100}是一个占位符,可以替换成任意数字,比如80或443等。
- selector:这是指定服务要选择的pod的选择器,它是一种键值对,可以用来匹配和筛选pod。这里的app: {你的app}表示要选择的pod的标签是app,值是{你的app},{你的app}是一个占位符,可以替换成任意字符串,比如my-app。
- apiVersion: networking.k8s.io/v1:这是指定Kubernetes API的版本,networking.k8s.io/v1是用来管理入口对象的API。
- kind: Ingress:这是指定要创建的对象的类型,Ingress是一种对象,它可以提供一个外部的访问地址和路径来路由请求到不同的服务。
- metadata:这是指定对象的元数据,比如名称、命名空间等。
- name:这是指定对象的名称,这里的in-scuapps-u0apps-{你的学号}表示这个入口的名称是in-scuapps-u0apps-{你的学号},{你的学号}是一个占位符,可以替换成任意字符串,比如123456。
- namespace:这是指定对象所属的命名空间,这里的{你的命名空间}是一个占位符,可以替换成任意字符串,比如my-namespace。
- spec:这是指定对象的规格,比如要定义的规则等。
- rules:这是指定入口要定义的规则的列表,每个规则都有一个主机名和一个或多个路径,可以用来路由请求到不同的服务。
- host:这是指定规则要匹配的主机名,这里的ai1.scuapps.cn表示要匹配的主机名是ai1.scuapps.cn。
- http:这是指定规则要匹配的HTTP协议的信息,它包含了一个或多个路径,可以用来路由请求到不同的服务。
- paths:这是指定规则要匹配的路径的列表,每个路径都有一个路径值、一个路径类型和一个后端,可以用来路由请求到不同的服务。
- path:这是指定路径要匹配的路径值,这里的/{你的学号}表示要匹配的路径值是/{你的学号},{你的学号}是一个占位符,可以替换成任意字符串,比如/123456。
- pathType:这是指定路径要匹配的路径类型,这里的Prefix表示要匹配的是前缀,也就是说,只要请求的路径以/{你的学号}开头,就会匹配这个路径,比如/123456/hello或/123456/world等。
- backend:这是指定路径要路由的后端的信息,它包含了一个服务的名称和端口,可以用来访问服务内的pod。
- service:这是指定后端要路由的服务的信息,它包含了一个服务的名称和端口,可以用来访问服务内的pod。
- name:这是指定服务的名称,这里的ai-front表示要路由的服务的名称是ai-front,它必须和上面定义的服务的名称一致。
- port:这是指定服务的端口的信息,它包含了一个端口号,可以用来访问服务内的pod。
- number:这是指定服务的端口号,这里的{5100}是一个占位符,可以替换成任意数字,比如80或443等,它必须和上面定义的服务的端口号一致。
6. 在网址中访问服务
{你注册额定主机}/{在上面文件中填的path}