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

 

posted @ 2022-01-23 20:50  童话述说我的结局  阅读(88)  评论(0编辑  收藏  举报