k8s应用程序生命周期管理

应用程序 -> 制作镜像 -> 部署 -> 升级 -> 回滚 -> 下线

deployment

deployment是最常用的k8s工作负载控制器,是k8s的一个抽象概念,用于更高级层次对象,部署和管理pod。其他的控制器还有daemonset,statefulset等。

主要功能:

  • 管理Pod和ReplacaSet

  • 具有上线部署、副本设定、滚动升级、回滚等功能

#创建命名空间
kubectl create namespace demo

#创建deployment资源部署应用镜像
kubectl create deployment web-demo --image=web-demo:v1 --replicas 3 --namespace demo

kubectl get deployment,pods -n demo

#重启calico相关组件pod
kubectl rollout restart daemonset calico-node -n calico-system 


#创建service对外暴露pod
kebectl expose deployment web-demo --port=80 --target-port=80 --typt=NodePort --name=web -n demo

kubectl get service -n web

yaml文件编排

示例:

等同于:

kubectl create deployment web-demo --image=lizhenliang/web-demo:v1 --replicas 3 -n demo

deployment.yaml详解

#控制器定义
apiVersion: apps/v1
kind: Deployment
metadate:
  name: web-demo
  namespace: demo
spec:
  replicas: 3
  selector:
    matchLables:
      app: web
#被控制对象(Pod)    
    template:
      metadate:
        labels:
          app: web
        spec:
          containers:
          - name: web
            image: lizhenliang/web-demo:v1
标签解释
apiVersionAPI版本
kind资源类型
metadata资源元数据
spec资源规格
replicas副本(实例)数量
selector标签选择器,与下面的metadata.labels保持一致
templatePod模板
metadatapod元数据
specpod规格
containers容器配置

查看资源对象的api版本:

kubectl api-resources | grep deployment

注意:

selector:标签选择器

label:标签

定义标签:

1、一般推荐定义两个,由项目和应用组成,例如:

project: ec
app: protal

2.maechLables必须要和下面的labels保持一直,否则apply会报错

service.yaml详解

apiVersion: v1
kind: Service
metadata:
  name: web-demo-v2
  namespace: web-demo
  labels:
    app: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
标签解释
portService端口,通过ClusterIP访问使用
targetPort镜像内服务端口,例如:nginx:80
selector标签选择器,与Development中的标签保持一直
typeService类型

官方文档示例:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

对应关系

#test-pod 
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中   
kind: Pod #指定创建资源的角色/类型   
metadata: #资源的元数据/属性   
  name: test-pod #资源的名字,在同一个namespace中必须唯一   
  labels: #设定资源的标签 
    k8s-app: apache   
    version: v1   
    kubernetes.io/cluster-service: "true"   
  annotations:            #自定义注解列表   
    - name: String        #自定义注解名字   
spec: #specification of the resource content 指定该资源的内容   
  restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器   
  nodeSelector:     #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1   
    zone: node1   
  containers:   
  - name: test-pod #容器的名字   
    image: 10.192.21.18:5000/test/chat:latest #容器使用的镜像地址   
    imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略, 
                           # Always,每次都检查 
                           # Never,每次都不检查(不管本地是否有) 
                           # IfNotPresent,如果本地有就不检查,如果没有就拉取 
    command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT   
    args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数   
    env: #指定容器中的环境变量   
    - name: str #变量的名字   
      value: "/etc/run.sh" #变量的值   
    resources: #资源管理 
      requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行   
        cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m) 
        memory: 32Mi #内存使用量   
      limits: #资源限制   
        cpu: 0.5   
        memory: 1000Mi   
    ports:   
    - containerPort: 80 #容器开发对外的端口 
      name: httpd  #名称 
      protocol: TCP   
    livenessProbe: #pod内容器健康检查的设置 
      httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常   
        path: / #URI地址   
        port: 80   
        #host: 127.0.0.1 #主机地址   
        scheme: HTTP   
      initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始   
      timeoutSeconds: 5 #检测的超时时间   
      periodSeconds: 15  #检查间隔时间   
      #也可以用这种方法   
      #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常   
      #  command:   
      #    - cat   
      #    - /tmp/health   
      #也可以用这种方法   
      #tcpSocket: //通过tcpSocket检查健康    
      #  port: number    
    lifecycle: #生命周期管理   
      postStart: #容器运行之前运行的任务   
        exec:   
          command:   
            - 'sh'   
            - 'yum upgrade -y'   
      preStop:#容器关闭之前运行的任务   
        exec:   
          command: ['service httpd stop']   
    volumeMounts:  #挂载持久存储卷 
    - name: volume #挂载设备的名字,与volumes[*].name 需要对应     
      mountPath: /data #挂载到容器的某个路径下   
      readOnly: True   
  volumes: #定义一组挂载设备   
  - name: volume #定义一个挂载设备的名字   
    #meptyDir: {}   
    hostPath:   
      path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种 
    #nfs

查看pod标签

kubectl get pods --show-labels -n web-demo

查看pod关联的后端service的IP和端口

kubectl get endpoints -n web-demo

根据yaml文件创建资源

kubectl create -f xxx.yaml

加载YAML文件创建资源

kubectl apply -f xxx.yaml

卸载YAML创建的资源

kubectl delete -f xxx.yaml

通过终端生成yaml文件

  • 用create命令生成

    kubectl create deployment nginx --image=mginx:1.24 --dry-run=client -o yaml > medeploy.yaml
    
    
    client:在kubectl层面验证可用性
    server:在api-server层面验证可用性
    
  • 用get命令导出

    kubectl get deployment nginx -o yaml > mydeploy.yaml
    
  • 获取资源下的字段

kubectl explain deployment
kubectl explain deployment.spec.template.spec.containers
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐