k8s资源清单创建pod、deployment、service


k8s 中所有的内容都抽象为资源,资源实例化之后,叫做对象。

1. k8s核心资源分类

1.1 工作负载型资源(workload)

  • pod:是k8s中最小的单元
  • ReplicaSet:调度器,通过标签控制 pod 的副本数目
  • Deployment:控制器,管理无状态的应用
  • StatefulSet:管理有状态的应用
  • DaemonSet:可以在每个节点运行 pod 主键
  • Job:批处理
  • CronJob:批处理

1.2 服务发现及负载均衡型资源(Service Discovery LoadBalance)

  • service
  • Ingress

1.3 配置与存储型资源

  • Volume(存储卷)
    • 云端存储
    • 亚马逊弹性块存储
    • SAN
    • NFS
    • GiusterFS(分布式存储)
  • 容器存储接口CSI
  • ConfigMap(配置中心)
  • Secret(保存敏感信息)
  • DownwardAPI(将外部环境的信息输出给容器)

1.4 集群级资源

  • Namespace:名称空间
  • Node:节点
  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding

1.5 元数据型资源

  • HPA:水平扩展的资源
  • PodTemplate(pod模板):用于让控制器创建pod是使用的模板
  • LimitRange(资源限制)

2. 创建资源的方式

  • 使用命令进行创建
  • 使用命令式资源清单创建
    - apiserver 仅接收json格式的资源定义
    - 使用yaml格式提供配置清单,apiserver 可自动将其转为 json 格式并执行
  • 使用声明式资源清单创建
    - 可以确保资源尽可能向声明的状态靠近,并且可以随时改变声明、随时应用新的声明

3. 资源清单的组成

  • apiVersion:apiversion版本
    - alpha(内测版)
    - beta(公测版)
    - stable(稳定版):例如v1
  • kind:资源类型
  • metadata:资源元数据
    - name:同一类别下唯一
    - namespace:名称空间
    - labels:标签
    - annotations:定义污点,
  • spec:期望的状态
  • status:当前的状态、本字段有k8s集群维护,用户不能定义和更改

4. 资源清单格式

是一个 yaml文件

apiVersion:  #指api的版本,一般是v1,定可以使用kubectl api-versions 获取版本信息
kind:       #资源类型,例如pod
metadata:  #资源元数据
   name:     
   namespace  #名称空间,不指定则默认是 default
   labels    #标签  
spec:   #详细定义对象

5. 资源清单配置实例

5.1 pod yaml

//暴露端口可以在外部访问
[root@k8s-master ~]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myweb-123
  namespace: lxr  #指定名称空间,这是我事先通过 kubectl create ns lxr 创建的
  labels:
    app: myweb
spec:
  containers:
    - name: web1
      image: lxr909626/httpd:v0.1
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
          hostPort: 8080   #这个端口必须是有效的,不能随便写
[root@k8s-master ~]# kubectl create -f pod.yaml
pod/myweb-123 created
[root@k8s-master ~]# kubectl get pods -n lxr -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE                    NOMINATED NODE   READINESS GATES
myweb-123   1/1     Running   0          10s   10.244.2.16   k8s-node2.example.com   <none>           <none>

在这里插入图片描述
一个pod创建两个容器

[root@k8s-master ~]# vim pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: myweb-123
  namespace: lxr
  labels:
    app: myweb
spec:
  containers:
    - name: web1
      image: lxr909626/httpd:v0.1
      imagePullPolicy: IfNotPresent
    - name: web2
      image: busybox
      command: ['/bin/sh','-c','sleep 3600']

[root@k8s-master ~]# kubectl create -f pod.yaml
pod/myweb-123 created
[root@k8s-master ~]# kubectl get pods -n lxr -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE                    NOMINATED NODE   READINESS GATES
myweb-123   2/2     Running   0          16s   10.244.2.22   k8s-node2.example.com   <none>           <none>

//进入容器
[root@k8s-master ~]# kubectl exec -n lxr -it myweb-123 -c web1 -- /bin/sh 
/ # 

5.2 deployment yaml

[root@k8s-master ~]# vim deploy.yaml 
apiVersion: apps/v1  #api版本
kind: Deployment  #资源类型
metadata:  #元数据定义
  name: nginx-deploy  #名称
  namespace: default   #名称空间
  labels:  #标签
    app: nginx-web
spec:   #deployment定义
  replicas: 3   #定义2个副本
  selector:    #标签选择器,匹配pod的标签
    matchLabels:
      app: nginx-web
  template:   #pod模板定义
    metadata:
      name: nginx-123
      namespace: default
      labels:  #这里的标签必须和标签选择器的一致
        app: nginx-web
    spec:   #pod内的容器定义
      containers:
        - name: web
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80   #暴露IP

[root@k8s-master ~]# kubectl create -f deploy.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get pod -o wide 
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE                    NOMINATED NODE   READINESS GATES
nginx-deploy-5759d97ff4-42z4b   1/1     Running   0          10s   10.244.1.10   k8s-node1.example.com   <none>           <none>
nginx-deploy-5759d97ff4-7ghls   1/1     Running   0          10s   10.244.2.26   k8s-node2.example.com   <none>           <none>
nginx-deploy-5759d97ff4-fcsz5   1/1     Running   0          10s   10.244.2.27   k8s-node2.example.com   <none>           <none>

//暴露端口到主机
[root@k8s-master ~]# kubectl expose deployment nginx-deploy --port=80 --type=NodePort
service/nginx-deploy exposed
[root@k8s-master ~]# kubectl get svc
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.96.0.1        <none>        443/TCP        3d7h
nginx-deploy   NodePort    10.101.226.188   <none>        80:31004/TCP   12s

访问
在这里插入图片描述

5.3 service yaml

为上面创建的 Deployment 资源定义service资源

[root@k8s-master ~]# vim svc.yaml 

apiVersion: v1
kind: Service
metadata:
    name: nginx-svc
    namespace: default
spec:
  selector:
    app: nginx-web
  type: NodePort
  ports:
    - nodePort: 30008
      port: 80
      targetPort: 80
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        3d11h
nginx-svc    NodePort    10.97.1.221   <none>        80:30008/TCP   3m16s

[root@k8s-master ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE                    NOMINATED NODE   READINESS GATES
nginx-deploy-5d9b7f8766-8ld62   1/1     Running   0          92s   10.244.2.50   k8s-node2.example.com   <none>           <none>
nginx-deploy-5d9b7f8766-jjk2v   1/1     Running   0          92s   10.244.1.38   k8s-node1.example.com   <none>           <none>
nginx-deploy-5d9b7f8766-mh8fm   1/1     Running   0          92s   10.244.1.39   k8s-node1.example.com   <none>           <none>

//查看endpoint资源端点列表
[root@k8s-master ~]# kubectl get endpoints
NAME         ENDPOINTS                                      AGE
kubernetes   192.168.249.141:6443                           3d11h
nginx-svc    10.244.1.38:80,10.244.1.39:80,10.244.2.50:80   13s
### 如何编写 Kubernetes 资源清单 YAML 文件 #### 1. 基本结构 Kubernetes 资源清单文件通常由几个核心字段组成,这些字段定义了资源的元数据、规格以及行为。以下是基本结构: ```yaml apiVersion: <API版本> # 定义所使用的 Kubernetes API 版本[^3] kind: <资源类型> # 指定要创建资源种类,例如 Pod, Service 等 metadata: name: <资源名称> # 设置资源的名字 spec: # 描述资源的具体配置细节 ... ``` #### 2. 实例演示 下面是一个简单的 Pod 配置示例,展示了如何使用上述结构来定义一个容器化的应用程序。 ```yaml apiVersion: v1 # 使用的核心 API 版本 kind: Pod # 创建的对象类型为 Pod metadata: name: my-first-pod # Pod 名称为 my-first-pod spec: containers: - name: nginx-container # 容器名为 nginx-container image: nginx:latest # 使用最新的 Nginx 镜像 ports: - containerPort: 80 # 映射容器端口到主机上的 80 端口 ``` 此示例中,`apiVersion`, `kind`, `metadata.name` 是必需字段,而 `spec.containers` 列表则描述了一个运行 Nginx 的单个容器及其开放的端口号[^4]。 #### 3. 应用资源配置 一旦完成了 YAML 文件的编写,可以利用 kubectl 工具将其应用至集群环境之中。常用命令如下所示: ```bash kubectl apply -f pod.yaml # 将 pod.yaml 中的内容应用于当前上下文中指定的 Kubernetes 集群 ``` 如果希望仅验证而不实际提交更改,则可采用以下方式测试配置的有效性: ```bash helm template --validate . | kubectl api-resources --validate=true -f - ``` 这一步骤能够确保生成的 YAML 文件符合预期的标准并能被 Kubernetes 正确解析[^2]。 #### 4. 更复杂的例子:Deployment 类型 对于更复杂的应用场景,可能需要用到 Deployment 来管理多个副本集服务扩展等功能。这里提供一段关于 Deployment 的样例代码供参考: ```yaml apiVersion: apps/v1 # 使用 applications API 组合下的 V1 版本 kind: Deployment # 对象类型设置为 Deployment metadata: name: example-deployment # deployment 名字设为例子部署 spec: replicas: 3 # 运行三个实例作为高可用保障 selector: matchLabels: app: webapp # 标签选择器匹配具有特定标签的服务 template: metadata: labels: app: webapp # 添加标签以便于服务发现机制识别 spec: containers: - name: demo-app # 主程序容器命名示范应用 image: nodejs-express-demo # 自定义镜像地址替换此处占位符 ports: - containerPort: 3000 # 开放内部监听端口给外部访问 ``` 以上展示了一种典型的多副本部署模式,其中包含了负载均衡自动恢复等特性支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值