• Basic(四)


    一、yaml文件

    apiVersion: v1   #版本号
    kind: Pod        #当前K8S资源的类型是Pod
    metadata:        #元数据
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
    • metadata表示key,下面的内容表示value,该value中包含两个直接的key:name和labels
    • name表示key,nginx-deployment表示value
    • labels表示key,下面的表示value,这个值又是一个map
    • app表示key,nginx表示value
    • 相同层级的记得使用空间缩进,左对齐
    • containers表示key,下面的表示value,其中value是一个数组
    • 数组中有两个元素,每个元素里面包含name和image
    • image表示key,myapp-container表示value

    转换成JSON

     {
     "apiVersion": "v1",
     "kind": "Pod",
     "metadata": {
                   "name": "myapp",
                   "labels": {
                               "app": "myapp"
                             }
                 },
      "spec": {
         "containers": [{
                         "name": "myapp-container01",
                         "image": "busybox:1.28",
                        }, 
                        {
                         "name": "myapp-container02",
                         "image": "busybox:1.28",
                        }]
              }
    }

    二、找个k8s的yaml文件

    官网网址:https://kubernetes.io/docs/reference/

    Deployment

    apiVersion: apps/v1                    #api版本
    kind: Deployment                     #想要创建的对象类别
    metadata:                            
      name: nginx-deployment            #创建的对象名称
    spec:                                #对象规约
      replicas:1                        #副本数
      selector:                            #标签选择器
        matchLables:                    #用于定义一组标签
          tier:frontend                    #架构标签
        matchExpressions:                #用于定义一组基于集合的筛选条件,可用的条件运算符包括In、 NotIn、 Exists和DoesNotExist。
          - {key: tier, operator: In, values: [frontend]}
        template:                       #开始定义pod
          metadata:                     
            labels:                     #定义pod的label
              app: app-demo             #pod标签
              tier: frontend            #架构标签
        spec:                           #指定该pod的资源内容,和对象规约
          containers:                   #业务容器配置
          - name: tomcat-demo           #容器名称
            image: tomcat               #镜像地址
            imagePullPolicy: ifNotPressent  #镜像加载方式,always:每次都查 Never:每次都不查不管本地是否有 ifNotPressent:如果本地有就不查,没有就去拉取
            ports:
            - containerPort: 8080       #容器对外开放端口

    Pod

    apiVersion: v1                  #必选,版本号,例如v1
    kind: Pod                       #必选,Pod
    metadata:                       #必选,元数据
      name: string                  #必选,Pod名称
      namespace: string             #必选,Pod所属的命名空间
      labels:                       #自定义标签
        - name: string              #自定义标签名字
      annotations:                  #自定义注释列表
        - name: string
    spec:                           #必选,Pod中容器的详细定义
      containers:                   #必选,Pod中容器列表
      - name: string                #必选,容器名称
        image: string               #必选,容器的镜像名称
        imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
        command: [string]           #容器的启动命令列表,如不指定,使用打包时使用的启动命令
        args: [string]              #容器的启动命令参数列表
        workingDir: string          #容器的工作目录
        volumeMounts:               #挂载到容器内部的存储卷配置
        - name: string              #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
          mountPath: string         #存储卷在容器内mount的绝对路径,应少于512字符
          readOnly: boolean         #是否为只读模式
        ports:                      #需要暴露的端口库号列表
        - name: string              #端口号名称
          containerPort: int        #容器需要监听的端口号
          hostPort: int             #容器所在主机需要监听的端口号,默认与Container相同
          protocol: string          #端口协议,支持TCP和UDP,默认TCP
        env:                        #容器运行前需设置的环境变量列表
        - name: string              #环境变量名称
          value: string             #环境变量的值
        resources:                  #资源限制和请求的设置
          limits:                   #资源限制的设置
            cpu: string             #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
            memory: string          #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests:                 #资源请求的设置
            cpu: string             #Cpu请求,容器启动的初始可用数量
            memory: string          #内存清楚,容器启动的初始可用数量
        livenessProbe:              #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
          exec:                     #对Pod容器内检查方式设置为exec方式
            command: [string]       #exec方式需要制定的命令或脚本
          httpGet:                  #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
            path: string
            port: number
            host: string
            scheme: string
            HttpHeaders:
            - name: string
              value: string
          tcpSocket:                #对Pod内个容器健康检查方式设置为tcpSocket方式
             port: number
           initialDelaySeconds: 0   #容器启动完成后首次探测的时间,单位为秒
           timeoutSeconds: 0        #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
           periodSeconds: 0         #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
           successThreshold: 0
           failureThreshold: 0
           securityContext:
             privileged:false
        restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
        nodeSelector: obeject       #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
        imagePullSecrets:           #Pull镜像时使用的secret名称,以key:secretkey格式指定
        - name: string
        hostNetwork:false           #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
        volumes:                    #在该pod上定义共享存储卷列表
        - name: string              #共享存储卷名称 (volumes类型有很多种)
          emptyDir: {}              #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
          hostPath: string          #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
            path: string            #Pod所在宿主机的目录,将被用于同期中mount的目录
          secret:                   #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
            scretname: string 
            items:    
            - key: string
              path: string
          configMap:                #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: string
            items:
            - key: string
              path: string

    Service

    apiVersion: v1   #kubernetesAPI版本
    kind: Service    #想要创建的对象类别
    metadata:        #帮助唯一性标识对象的一些数据
      name: myapp    #创建的对象名称
      namespace: default  #创建对象所在的命名空间
    spec:                 #对象规约
      type: ClusterIP     #服务暴露类型,一般有ClusterIp,Nodeport,loadBlannce
      selector:           #标签选择器        
        app: mysql        #查找与之匹配的pod标签
        release: stabel
      ports:
      - name: mysql          #端口名称
        port: 3306           #service 暴露在 cluster ip上的端口
        targetPort: 3306     #targetPort 是 pod 上的端口
        nodePort: 33066      #暴露在集群物理节点上 node 的端口 

    statefulset

    apiVersion: apps/v1beta1                                #创建该对象所使用的kubernetes API版本
    kind: StatefulSet                                        #想要创建的对象类别
    metadata:                                                #帮助唯一性标识对象的一些数据
      name: showdoce                                        #想要创建的对象名字,同一个namespace中必须唯一
      namespace: default                                    #想要创建的对象所在的命名空间
      labels:                                                #想要创建的对象的标签,statefulset lables
        app: showdoc
    spce:                                                    #对象规约,指定资源的内容
      serviceName: showdoc                                    #对象名称
      replicas: 1                                            #副本数
      template:                                             #这里开始定义pod
        metadata:                                            #定义pod的label
          labels:
            app: showdoc
        spec:                                                #指定该资源内容
          terminationGracePeriodSeconds: 180     
          imagePullSecrets:                                    设置远程镜像仓库登录的账号密码
          - name: registry-pass                                #调用secrets中创建的账号和密码
          containers:                                        #业务容器
          - name: showdoc                                    #容器的名字
            image: [容器镜像]                                #容器使用的镜像地址
            imagePullPolicy: IfNotPresent                     #同上initcontainers
            env:                                            #环境变量
            - name: MYSQL_ROOT_PASSWORD                        #通过环境变量设置mysql_root的账户和密码
              valueFrom:
                secretKeyRef:                                #同样调用secret来设置mysql的初始账户和密码
                  name: mysql-pass
                  key: password
            ports:
            - containerPort:80                                #容器对外开放的端口
              name: port                                    #端口名字
            volumeMounts:                                    #挂载持久存储卷
            - name:db                                        #挂载设备名字,与volume的name对应
              mountPath: /var/lib/mysql                            #挂载到容器的/var/www/html路径下
      volumeClaimTemplates:                                    #存储卷申请模板,创建PVC,指定pvc名称大小,将自动创建pvc,且pvc必须由存储类供应
      - metadata:
          name: db                                            #定义一个挂在设备名字
        spec:
          accessModes: ["ReadWriteMany"]                    #挂载存储的默写模式
          storageClassName: nfs-mysql                        #存储类名字"命名空间"
          resources:                                        #存储资源
            requests:
              storage: 50Gi                                    #存储资源空间大小

    完整配置

    apiVersion: v1       #必选,版本号,例如v1
    kind: Pod       #必选,Pod
    metadata:       #必选,元数据
      name: string       #必选,Pod名称
      namespace: string    #必选,Pod所属的命名空间
      labels:      #自定义标签
        - name: string     #自定义标签名字
      annotations:       #自定义注释列表
        - name: string
    spec:         #必选,Pod中容器的详细定义
      containers:      #必选,Pod中容器列表
      - name: string     #必选,容器名称
        image: string    #必选,容器的镜像名称
        imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
        command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令
        args: [string]     #容器的启动命令参数列表
        workingDir: string     #容器的工作目录
        volumeMounts:    #挂载到容器内部的存储卷配置
        - name: string     #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
          mountPath: string    #存储卷在容器内mount的绝对路径,应少于512字符
          readOnly: boolean    #是否为只读模式
        ports:       #需要暴露的端口库号列表
        - name: string     #端口号名称
          containerPort: int   #容器需要监听的端口号
          hostPort: int    #容器所在主机需要监听的端口号,默认与Container相同
          protocol: string     #端口协议,支持TCP和UDP,默认TCP
        env:       #容器运行前需设置的环境变量列表
        - name: string     #环境变量名称
          value: string    #环境变量的值
        resources:       #资源限制和请求的设置
          limits:      #资源限制的设置
            cpu: string    #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
            memory: string     #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests:      #资源请求的设置
            cpu: string    #Cpu请求,容器启动的初始可用数量
            memory: string     #内存清楚,容器启动的初始可用数量
        livenessProbe:     #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
          exec:      #对Pod容器内检查方式设置为exec方式
            command: [string]  #exec方式需要制定的命令或脚本
          httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
            path: string
            port: number
            host: string
            scheme: string
            HttpHeaders:
            - name: string
              value: string
          tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
             port: number
           initialDelaySeconds: 0  #容器启动完成后首次探测的时间,单位为秒
           timeoutSeconds: 0   #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
           periodSeconds: 0    #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
           successThreshold: 0
           failureThreshold: 0
           securityContext:
             privileged:false
        restartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
        nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
        imagePullSecrets:    #Pull镜像时使用的secret名称,以key:secretkey格式指定
        - name: string
        hostNetwork:false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
        volumes:       #在该pod上定义共享存储卷列表
        - name: string     #共享存储卷名称 (volumes类型有很多种)
          emptyDir: {}     #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
          hostPath: string     #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
            path: string     #Pod所在宿主机的目录,将被用于同期中mount的目录
          secret:      #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
            scretname: string  
            items:     
            - key: string
              path: string
          configMap:     #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: string
            items:
            - key: string

    yaml模板

    apiVersion: v1
    kind: Service
    metadata:
      name: config
      namespaces: 
      labels:
        app: config
    spec:
      ports:
        - name: http
          port: 8888
          protocol: TCP
          targetPort: 8888
          nodePort: 8888
      selector:
        app: blog-nginx
        tier: frontend          #架构标签
      type: NodePort
      sessionAffinity: ClientIP #会话保持,来自于同一个客户端的请求调度到同一个pod中
    ---
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: config
      labels:
        app: config
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: config
          tier: frontend
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: config
            tier: frontend
        spec:
          restartPolicy: Always
          containers:
          - name: config
            image: 192.168.66.177:5000/sqshq/piggymetrics-config:v01
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8888
              protocol: TCP
              name: config
            readinessProbe:
              tcpSocket:
                port: 8888
              initialDelaySeconds: 10 #kubelet会在容器启动的10秒后发送第一个就绪探测,这回尝试连接config容器的8888端口,如果探测失败会被重新启动
              periodSeconds: 20 #kubelet 将继续每隔20秒运行一次检测
            livenessProbe:
              tcpSocket:
                port: 8888
              initialDelaySeconds: 20 #kubelet会在容器启动20秒后进行第一次存活探测
              periodSeconds: 30 #kubeleth会尝试连接config容器的8888端口.如果存活探测失败,这个容器会被重新启动
            resources:
              requests:
                cpu: 0.1  #cpu要求0.1个
                memory: 1Gi #内存要求1Gi
              limits:
                cpu: 2    #cpu限制最大限制为2个、
                memory:   #内存最大限制为2Gi
            env:                        #环境变量
            - name: MYSQL_SERVICE_HOST
              value: 'mysql'
            - name: MYSQL_SERVICE_PORT
              value: '3306'

     三、以yml创建pod

    (1)创建一个pod的yaml文件,名称为nginx_pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx
        ports:
        - containerPort: 80

    (2)根据该文件创建pod

    vi nginx_pod.yaml

    然后将nginx_pod.yaml内容放进去,然后执行下面命令进行创建

    kubectl apply -f nginx_pod.yaml

    (3)查看pod

    kubectl get pods

     (4)查看详细信息

    kubectl get pods -o wide

     从里面可以看到运行的ip及运行在哪个节点上,我是因为网络不行,还在构建中所以还看不到

    (5)查看具体pod的详细信息

    kubectl describe pod nginx-pod

     (6)进入nginx的容器命令和docker一样

    docker exec -it ip bash

      (7)删除Pod

    kubectl delete -f nginx_pod.yaml
    kubectl get pods

    四、Storage and Networking

    pods的网络:https://kubernetes.io/docs/concepts/workloads/pods/#networking

     按网上说法每个pods都有一个唯一的ip地址,用心的可以在我前面的命令中感受到

    kubectl get pods -o wide

  • 相关阅读:
    雅虎天气API调用
    HttpOperater
    HttpOperater-模拟HTTP操作类
    页面局部加载,适合Ajax Loading场景(Demo整理)
    FTPHelper-封装FTP的相关操作
    使用SOCKET实现TCP/IP协议的通讯
    IIS目录禁止执行权限
    Oracle10g 安装步骤
    SQL Server 2008、SQL Server 2008R2 自动备份数据库
    SQL列转行
  • 原文地址:https://www.cnblogs.com/xing1/p/15810349.html
Copyright © 2020-2023  润新知