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

本文介绍了k8s的核心资源,包括工作负载资源如Pod、ReplicaSet、Deployment和StatefulSet,以及服务发现和负载均衡的Service资源。重点讲解了如何通过资源清单(yaml格式)来创建和管理这些资源,包括apiserver的交互方式、资源清单的组成结构,以及Deployment和Service的具体配置示例。

k8s核心资源分类

工作负载型资源(workload)

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

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

service
Ingress 

创建资源的方式

使用命令进行创建
使用命令式资源清单创建

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

资源清单的组成

apiVersion:apiversion版本

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

资源清单格式

是一个 yaml文件

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

资源清单配置

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

一个pod创建两个容器

[root@master ~]# vim pod.yaml 

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

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

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

deployment yaml

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

//暴露端口到主机
[root@master ~]# kubectl expose deployment nginx-deploy --port=80 --type=NodePort
service/nginx-deploy exposed
[root@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

service yaml

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

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

//查看endpoint资源端点列表
[root@master ~]# kubectl get endpoints
NAME         ENDPOINTS                                      AGE
kubernetes   192.168.31.140:6443                           3d11h
nginx-svc    10.244.1.38:80,10.244.1.39:80,10.244.2.50:80   13s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值