k8s声明式创建
- kubernetes陈述式创建与声明式创建
- yaml各个字段含义
- Pod yaml文件详解
- deployment.yaml文件详解
- server.yaml文件详解
 
- k8s中port的区别
- 1、声明式创建pod label包含app: zhangsan
- 2、声明式创建deployment,包含3个nginx副本,label包含app: zhangsan
- 3、创建一个service,对题2中的服务暴露到集群外部,可以通过nodeIP:nodePort访问,集群内部可以通过clusterIP:9001访问
- 4、声明式部署tomcat集群
- 5、创建一个pod包含两个initContainer和一个应用容器 ,该pod依赖于A和B两个service
 
kubernetes陈述式创建与声明式创建
Kubernetes支持两种方式来创建和管理资源:陈述式创建和声明式创建。
陈述式创建是指通过提供完整的资源配置来创建和管理资源。用户需要手动编写包含所有资源属性的配置文件,然后使用Kubernetes API将配置文件提交给Kubernetes集群。这种方式需要用户对资源的详细属性有较为全面的了解,并且需要手动处理资源的创建、更新和删除等操作。
声明式创建是指通过提供资源的期望状态来创建和管理资源。用户只需要编写包含资源的期望状态的配置文件,然后使用Kubernetes API将配置文件提交给Kubernetes集群。Kubernetes会根据用户提供的期望状态来自动创建、更新和删除资源,保持实际状态与期望状态的一致性。这种方式相对于陈述式创建更加简洁和高效,减少了用户的工作量。
声明式创建是Kubernetes的核心理念之一,它带来了很多好处。首先,声明式创建可以提高用户的生产力,用户只需要关注资源的期望状态,而不需要关注具体的创建细节。其次,声明式创建可以提供自愈能力,Kubernetes会自动检测资源的实际状态与期望状态之间的差异,并自动采取措施使它们保持一致。最后,声明式创建可以提供资源的可观察性,用户可以通过查看资源的期望状态来了解资源的状态和健康状况。
总之,Kubernetes的声明式创建是一种更加高效和可靠的资源管理方式,它使用户能够更轻松地创建和管理资源,并且能够提供自愈能力和可观察性。
yaml各个字段含义
Pod yaml文件详解
在Kubernetes中,Pod是Kubernetes的最小部署单元,是由一个或多个容器组成的,这些容器共享网络和存储资源。
Pod的YAML文件是描述Pod的配置文件。它使用YAML(Yet Another Markup Language)语法来定义Pod的各个字段。
下面详细解释Pod的YAML文件中各个字段的含义:
- apiVersion:指定使用的Kubernetes API版本。
- kind:指定对象的类型,这里是"Pod"。
- metadata:包含有关资源的元数据,如名称、标签、注释等。 
  - name:指定Pod的名称。
- labels:指定用于标识Pod的键值对标签。
 
- spec:指定Pod的规范。 
  - containers:指定Pod中包含的容器的列表。 
    - name:指定容器的名称。
- image:指定容器使用的镜像。
- ports:指定容器需要暴露的端口。
 
- restartPolicy:指定容器重启的策略。
- volumes:指定Pod使用的卷,用于在容器之间共享数据。
- hostNetwork:设置为true时,Pod将使用主机网络,而不是独立的网络命名空间。
- hostPath:指定Pod使用的主机路径。
- nodeSelector:指定Pod将被调度到的节点。
- affinity:指定Pod的亲和性规则。
- tolerations:指定Pod的容忍规则,用于指定Pod能够容忍哪些污点。
- resources:指定Pod使用的资源限制和请求。
- volumes:指定Pod使用的卷。
- initContainers:指定Pod中包含的初始化容器的列表。
- serviceAccountName:指定Pod使用的服务帐户。
- dnsPolicy:指定Pod使用的DNS策略。
- imagePullSecrets:指定拉取私有镜像所需的密钥。
 
- containers:指定Pod中包含的容器的列表。 
    
这些字段通常被组织在一起,形成一个完整的Pod的YAML文件。通过编辑Pod的YAML文件,可以定制Pod的配置,以满足特定的部署需求。
# yaml格式的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数,1000m代表一个核心,100m代表0.1核心,将用于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
deployment.yaml文件详解
deployment.yaml文件是Kubernetes中用来定义Deployment资源的配置文件。以下是一个示例的deployment.yaml文件的详解:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:1.0
        ports:
        - containerPort: 8080
- apiVersion: 定义了使用的Kubernetes API版本,这里使用的是apps/v1版本。
- kind: 定义了资源的类型,这里是Deployment。
- metadata: 定义了Deployment的元数据,包括名称(name)等信息。
- spec: 定义了Deployment的规格,包括副本数(replicas),选择器(selector)和模板(template)等信息。
- replicas: 指定了期望的副本数,这里是3个副本。
- selector: 指定了Deployment通过标签选择器来选择Pod的方式。这里的选择器是匹配标签为app=my-app的Pod。
- template: 定义了创建Pod的模板,包括元数据(metadata)和规格(spec)。
- labels: 定义了Pod的标签,这里的标签为app=my-app。
- containers: 定义了Pod中的容器,包括名称(name),镜像(image)和端口(ports)等信息。
- containerPort: 定义了容器监听的端口,这里是8080端口。
以上是一个简单的deployment.yaml文件的详解,它定义了一个Deployment资源,指定了副本数、选择器和模板等信息,用于创建和管理Pod。
server.yaml文件详解
server.yaml文件是一个配置文件,用于配置服务器的各种属性和行为。
以下是server.yaml文件中可能包含的一些常见配置项:
-  server_name: 指定服务器的名称或标识符。 
-  server_address: 指定服务器的IP地址或域名。 
-  port: 指定服务器监听的端口号。 
-  ssl_certificate: 指定服务器使用的SSL证书文件路径。 
-  ssl_key: 指定服务器使用的SSL私钥文件路径。 
-  access_log: 指定访问日志文件的路径。 
-  error_log: 指定错误日志文件的路径。 
-  root: 指定服务器的根目录,即网站文件的存放路径。 
-  index: 指定默认的首页文件名。 
-  gzip: 指定是否启用gzip压缩。 
-  proxy_pass: 指定反向代理的目标地址。 
-  location: 指定不同URL路径的配置。 
-  upstream: 指定负载均衡的服务器列表。 
-  timeout: 指定服务器的超时时间。 
-  max_body_size: 指定允许的请求体大小。 
-  try_files: 指定服务器查找文件的顺序。 
-  auth_basic: 指定是否启用HTTP基本身份验证。 
k8s中port的区别
在Kubernetes (k8s)中,port具有不同的含义和用途。以下是port在k8s中的不同概念和区别:
-  Port:在k8s中,port用于定义服务或者Pod暴露给集群内部或外部的端口。它是一个整数值,并且是一个抽象的概念,通常用于定义访问服务或Pod的端口号。 
-  NodePort:NodePort是一种服务类型,通过NodePort方式将服务暴露给集群外部。NodePort是一个范围在30000-32767之间的整数,它将集群中的某个端口映射到Pod的端口,从而使得外部可以通过访问Node的IP地址和NodePort访问到服务。 
-  HostPort:HostPort是一种将Pod中的容器端口直接映射到Node主机上的端口的方式。通过使用HostPort,容器的端口将直接绑定到Node主机的物理网卡上,从而可以通过Node主机的IP地址和端口直接访问容器。需要注意的是,使用HostPort会有一些安全和网络隔离的考虑。 
-  ContainerPort:在k8s中,ContainerPort是一个容器内的端口,它定义了容器内的应用程序暴露的端口号。容器中的应用程序可以通过ContainerPort进行监听,并接受来自其他容器或服务的请求。 
-  TargetPort:TargetPort是一个服务端口,它指向Pod中的ContainerPort。当服务将请求转发给后端Pod时,将使用TargetPort来指定请求应该转发到Pod中的哪个ContainerPort。TargetPort和ContainerPort通常是相同的,但也可以不同,这取决于服务和Pod的具体配置。 
总结:在k8s中,Port是一个抽象的概念,用于定义服务或Pod暴露的端口号。NodePort是一种服务类型,将服务暴露给集群外部。HostPort是一种将Pod中的容器端口直接映射到Node主机上的端口的方式。ContainerPort定义了容器内应用程序暴露的端口号。TargetPort指向Pod中的ContainerPort,用于指定请求转发的目标端口。
1、声明式创建pod label包含app: zhangsan
apiVersion: v1
kind: Pod
metadata:
  name: httpd # Name of the Pod
  namespace: default # Namespace where the Pod will be deployed
  labels: # Labels to identify the Pod
    app: zhangsan
spec: # Specification of the Pod
  containers: # List of containers in the Pod
  - name: httpd # Name of the container
    image: httpd # Image to run in the container
    ports: # List of ports to expose
    - name: httpdport # Name of the port
      containerPort: 80 # Port number exposed by the container


2、声明式创建deployment,包含3个nginx副本,label包含app: zhangsan
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: zhangsan
      type: nginx-deployment
  template:
    metadata:
      labels:
        app: zhangsan
        type: nginx-deployment
    spec:
      containers:
      - name: my-container
        image: nginx
        ports:
        - containerPort: 80


3、创建一个service,对题2中的服务暴露到集群外部,可以通过nodeIP:nodePort访问,集群内部可以通过clusterIP:9001访问
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  ports:
  - port: 9001
    targetPort: 80
    nodePort: 31111
  selector:
    app: zhangsan
    type: nginx-deployment
kubectl apply -f nginx-service-test.yaml 

 
 
4、声明式部署tomcat集群
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mytomcat
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mytomcat
  template:
    metadata:
      labels:
        app: mytomcat
    spec:
      containers:
      - name: mytomcat
        image: tomcat:8
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: yun-config
          mountPath: /etc/localtime
      volumes:
      - name: yun-config
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai

5、创建一个pod包含两个initContainer和一个应用容器 ,该pod依赖于A和B两个service
test_init.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mynginx
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mynginx; do echo waiting for mynginx; sleep 2; done;']

mysevice.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
kubectl apply -f myservice.yaml

mynginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: mynginx
spec:
  type: NodePort
  ports:
  - port: 81
    targetPort: 80
kubectl apply -f mynginx.yaml

















![机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]](https://i-blog.csdnimg.cn/direct/9b1285613c3c4130a91c397eff02e61a.png#pic_center)


