欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kubernetes pod的yaml详解

程序员文章站 2024-03-11 10:05:55
...

Kubernetes pod的yaml详解以及在安装Kubernetes时遇到的问题记录

#Podyaml书写规范及注释
apiVersion: v1 #版本号      必填
kind: Pod      #对象选择    必填
metadata:      #元数据      必填
  name: string #Pod名称     必填
  namespaces: string #所属命名空间,默认为default 必填
  labels:            #自定义标签列表
    name: string   #标签名称
  annotations:       #自定义注解列表
    name: string   #注解列表
spec:                #Pod中容器的详细定义   必填
  containers:        #Pod中容器列表         必填
  - name: string     #容器名称              必填
    image: string    #镜像名称              必填
    imagePullPolicy: [Always|Never|ifNotPresent] #镜像获取策略,默认为Always,Always: 每次都尝试重新下载 
                                                 #Never:仅使用本地镜像
                                                 #ifNotPresent:本地有时使用本地镜像,反之下载镜像
    command: [string] #容器启动时的命令列表,如不指定则使用打包镜像时的命令
    args: [string]    #容器启动命令参数列表
    workingDir: string #容器工作目录
    volumeMounts:      #挂载到容器内部的存储卷配置
    - name: string     #存储卷名称,需要使用volumes[]部分共享存储卷名称
      mountPath: string #存储卷在容器内的绝对路径
      readOnly: boolean #是否为只读模式,默认为读写模式
    ports:              #容器需要暴露的端口列表
    - name: string      #端口的名称
      containerPort: int #容器需要监听的端口号
      hostPort: int      #容器所在的主机需要监听的端口号,默认与containerPort相同,设置hostPort时,同一台宿主机无法启动第二份副本
      protocal: string   #端口协议,支持TCP、UDP,默认为TCP
    env:                 #容器运行钱需要配置的环境列表
    - name: string       #环境变量名称
      value: string      #变量值
    resources:           #资源限制和资源请求设置
      limits:            #资源限制
        cpu: string      #cpu限制,单位为core数
        memory: string   #内存限制,单位可为MiB/GiB等
      requests:          #请求限制
        cpu: string      #cpu请求,单位为core数,启动容器时初始可用数量
        memory: string   #内存请求,单位可为MiB/GiB等,容器启动的初始可用数量
    livenessProde:       #对Pod内个容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器,可以设置的方法包括exec、httpGet、tcpSocket,对一个容器仅需设置一种
      exec:              #exec方式
        command: [string] #指定命令或脚本
      httpGet:           #httpGet方式,需指定path,port
        path: string     
        port: number
        host: string
        scheme: string
        httpHeaders:
        - name: string
          value: string
      tcpSocket:         #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: object        #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
  imagePullSecrets:           #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork: false          #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:                    #在该Pod上定义共享存储卷列表
  - name: string              #共享存储卷的名称,在一个Pod中每个存储卷定义一个名称,容器定义部分containers[].volumeMounts[].name将引用该共享存储卷的名称
                              #volume的类型包括:emptyDir, hostPath、gcePersistentDisk,secret,configMap等等,可以定义多个volume,但每个volume名称需要保持唯一
    emptyDir: {}              #类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值是一个空对象:emptyDir{}
    hostPath:                 #类型为hostPath的存储卷,表示挂载Pod所在的宿主机目录
      path: string            #Pod所定义的主机目录,将被用于容器中mount的目录
    secret:                   #类型为secret的存储卷,表示挂载集群预定义的secret对象到容器目录
      secretName: string
      items:
      - key: string
        path: string
    configMap:                #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string

#Service书写规范及注释
apiVersion: v1                #api-version版本,必填
kind: Service                 #对象选择,必填
metadata:                     #元数据,必填
  name: String                #Service名称,必填
  labels:                     #自定义标签
    name: String              #标签名称
spec:                         #Service详细定义
  clusterIP: 10.254.109.210   #k8s集群ip,本IP为虚拟ip,只限于在集群内部使用
  type: NodePort              #node节点端口方式映射服务ip
  selector:                   #Pod标签选择
    app: String               #选择某app的名称的Pod
  ports:                      #端口列表
  - port: 80                  #Service端口
    targetPort: 3000          #转发到后台Pod的端口
    nodePort: 32817           #映射到node上的端口
    protocol: TCP             #传输协议:TCP/UDP, 默认为TCP



#k8s使用:
#搭建k8s集群所需的镜像均需访问国外网站,部分镜像已重新打包放在阿里云镜像仓库服务中
1. #添加docker仓库认证凭证
   #kubectl create secret docker-registry aliyun-registry --docker-server=registry.cn-shenzhen.aliyuncs.com --docker-username=****** --docker-password=******
   #podName.yaml 中: imagePullSecrets: 
   #            name: aliyun-registry

2. #创建弹性伸缩器,需安装metrics-server插件,否则无法获取pod及node的资源数据
   #kubectl autoscale delpoyment rails-web --max=10 --min=3 --cpu-percent=50 当cpu的占有率超过50%时,为rails-web这个deployment创建一个副本最大为10,最小为3的副本,使其cpu保持在50%左右

3. #在安装metrics-server插件时,需要注意以下内容:
   #①:开启聚合层,因为metrics-server也是一种api,所以需要在kube-apiserver.service中添加如下参数:
   #    --requestheader-client-ca-file=/etc/kubernetes/cert/ca.pem       
   #    --requestheader-allowed-names=""
   #    --requestheader-extra-headers-prefix="X-Remote-Extra-"
   #    --requestheader-group-headers=X-Remote-Group
   #    --requestheader-username-headers=X-Remote-User
   #    --proxy-client-cert-file=/etc/kubernetes/cert/metrics-server.pem
   #    --proxy-client-key-file=/etc/kubernetes/cert/metrics-server-key.pem
   #    --runtime-config=api/all=true
   # 但是在实际应用过程中--requestheader-allowed-names=""这个参数应该去掉,否则会报一些奇怪的错误,如Error from server (ServiceUnavailable): the server is currently unable to handle the request等,具体原因未知
   #②:更换镜像:
   #  image: k8s.gcr.io/metrics-server-amd64:v0.3.1 ------------------------> image: registry.cn-shenzhen.aliyuncs.com/tenmind_kubernetes/metrics-server:0.3.1
   #  image: k8s.gcr.io/addon-resizer:1.8.3   ------------------------------> image: registry.cn-shenzhen.aliyuncs.com/tenmind_kubernetes/addon-resizer:1.8.3
   #③:更改metrics-server-deployment.yaml文件addon-resizer镜像的一些启动参数:
   #    - --cpu={{ base_metrics_server_cpu }}    --------------------------------->   - --cpu=80m                 
   #    - --extra-cpu=0.5m   ----------------------------------------------------->   - --extra-cpu=8m
   #    - --memory={{ base_metrics_server_memory }} ------------------------------>   - --memory=80Mi
   #    - --extra-memory={{ metrics_server_memory_per_node }}Mi ------------------>   - --extra-memory=8Mi
   #    - --threshold=5      ----------------------------------------------------->   - --threshold=5
   #    - --deployment=metrics-server-v0.3.1  ------------------------------------>   - --deployment=metrics-server-v0.3.1
   #    - --container=metrics-server   ------------------------------------------->   - --container=metrics-server
   #    - --poll-period=300000      ---------------------------------------------->   - --poll-period=300000
   #    - --estimator=exponential   ---------------------------------------------->   - --estimator=exponential
   #    - --minClusterSize={{ metrics_server_min_cluster_size }} ----------------->   #- --minClusterSize={{ metrics_server_min_cluster_size }}
   # 所有参数必须填充为实际的值,不然无法容器启动成功
   #④:更改metrics-server-deployment.yaml文件mertics-server镜像的一些启动参数:       
   #    - --metric-resolution=30s         
   #    - --kubelet-port=10255
   #    - --deprecated-kubelet-completely-insecure=true
   #        ||||
   #    - --kubelet-insecure-tls
   #    - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
   #     - --metric-resolution=30s
   #     #- --source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250
   #     #- --kubelet-port=10250
   #     #- --deprecated-kubelet-completely-insecure=true

4. #kubectl 常用使用命令
   #①: kubectl get pod | svc | ...   获取一些pod或者service....的状态
   #     衍生使用: kubectl get pod -o wide   |    kubectl get pod | grep podName
   #②: kubectl create -f name.yaml   创建一个或多个资源对象
   #③: kuebctl delete pods podName   删除一个pod
   #             delete -f name.yaml   删除一个或多个资源对象    
   #④: kubectl replace -f name.yaml  替换一个或多个资源对象
   #⑤: kubectl set image deployment/deploymentName   deploymentName=registry.cn-shenzhen.aliyuncs.com/tenmind_kubernetes/dms:v1.0.12  在集群中更新一个镜像
   #⑥: kubectl edit Deployment | Pod | Service  Name 修改并替换资源
   #⑦: kubectl rollout status deployments nginx-deployment 查看rollout状态
   #⑧: kubectl rollout history deployment/nginx-deployment 检查deployment的升级历史版本
   #⑨: kubectl rollout history deployment/nginx-deployment --revision=2 检查某个具体版本的信息
   #⑩: kubectl rollout undo deployment/nginx-deployment   回滚到上一个版本
   #11: kubectl rollout undo deployment/nginx-deployment --to-revision=2  回退到某个版本

5. #连接外部数据源:通常情况下: 数据库并不适合放在容器中: 数据库集群工作繁杂,而放在容器中更加难以维护
   #k8s中的解决思路:将外部的地址转变为集群本身的服务,而应用本身只需连接jdbc服务便可以访问外部数据库,如下:
   # apiVersion: v1                         
   # kind: Endpoints                  #创建EndPoints资源对象
   # metadata:
   #   name: jdbc
   # subsets:                         #外部网络参数列表                  
   #  - addresses:                    #外部网络地址
   #    - ip: 58.16.181.25            
   #    ports:
   #    - port: 3306
   #      protocol: TCP

   # ---
   # apiVersion: v1
   # kind: Service
   # metadata:
   #   name: jdbc
   # spec:
   #   clusterIP: 10.254.150.201
   #   ports:
   #   - port: 3306
   #     targetPort: 3306
   #     protocol: TCP

# 6. pvc(PersistentVolumeClaim)创建(目前试验结果:安装nfs后创建pvc挂载nfs会导致摸个节点noready,原因未知)
#    ①:安装nfs(网络文件系统),安装网址:https://www.cnblogs.com/lixiuran/p/7117000.html
#        一、安装 NFS 服务器所需的软件包:
#           yum install -y nfs-utils
#        二、编辑exports文件,添加从机
#           vim /etc/exports
#           /home/nfs/ 192.168.248.0/24(rw,sync,fsid=0)
#           同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中
          
#           rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录

#        三、启动nfs服务

#          先为rpcbind和nfs做开机启动:(必须先启动rpcbind服务)

 
#          systemctl enable rpcbind.service
#          systemctl enable nfs-server.service
#          然后分别启动rpcbind和nfs服务:
        
         
#          systemctl start rpcbind.service
#          systemctl start nfs-server.service
#          确认NFS服务器启动成功:
        
         
#          rpcinfo -p
#          检查 NFS 服务器是否挂载我们想共享的目录 /home/nfs/:
        
#          exportfs -r
#          #使配置生效
        
#          exportfs
#          #可以查看到已经ok
#          /home/nfs 192.168.248.0/24

#        四、在从机上安装NFS 客户端

#          首先是安裝nfs,同上,然后启动rpcbind服务
#          先为rpcbind做开机启动
#          systemctl enable rpcbind.service
#          然后启动rpcbind服务:
#          systemctl start rpcbind.service
#          注意:客户端不需要启动nfs服务
#          检查 NFS 服务器端是否有目录共享:showmount -e nfs服务器的IP
#          showmount -e 192.168.248.208
#            Export list for 192.168.248.208:
#          /home/nfs 192.168.248.0/24
#          在从机上使用 mount 挂载服务器端的目录/home/nfs到客户端某个目录下:
#          cd /home && mkdir /nfs
#          mount -t nfs 192.168.248.208:/home/nfs /home/nfs
#          df -h 查看是否挂载成功。
#     ②: 

# 7,安装harbor镜像仓库,
#     ①:安装docker-compose
#         因为harbor服务是用docker-compose编排的,所以需要先安装:
#         wget https://github.com/docker/compose/releases/download/1.21.2/docker-compose-Linux-x86_64
#         mv ~/docker-compose-Linux-x86_64 ./docker-compose
#         chmod a+x ./docker-compose
#         mv ./dokcer-compose /usr/bin/
#     ②:使用openssl自签ssl证书
#         openssl req  -newkey rsa:4096 -nodes -sha256 -keyout ca.key  -x509 -days 3650 -out ca.crt #生成ca.key、ca.crt证书,过期时间:3650天
#         openssl req  -newkey rsa:4096 -nodes -sha256 -keyout 192.168.2.135.key  -out 192.168.2.135.csr #跳过设置密码,直接按enter
#         echo subjectAltName = IP:192.168.2.135,IP:58.16.181.25 > extfile.cnf  #使用ip时最好执行这条
#         openssl x509 -req -days 365 -in 192.168.2.135.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out 192.168.2.135.crt
#     ③:安装harbor(试验结果:使用https模式时映射到外网无法登陆docker-registry(原因未能查出),后使用http模式,出错原因可在挂载的目录查看log)
#         下载harbor,离线安装模式
#         wget  --continue https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.1.tgz
#         tar -xzvf harbor-offline-installer-v1.5.1.tgz
#         cd harbor
#         docker load -i harbor.v1.5.1.tar.gz #加载harbor所需的镜像
#         更改docker-compose.yml文件,因为harbor默认的文件挂载是在/data目录,若/磁盘空间存储不够需将/data目录更改为其他目录,注:/data/secretkey目录不能更改,试验时更改后会报错:..../data/secretkey is a directory
#         更改prepare环境检查文件
#         <     empty_subj = "/"
#         ---
#         >     empty_subj = "/C=/ST=/L=/O=/CN=/"
#         https模式:
#         更改harbor.cfg 
#         < hostname = 192.168.2.135
#         ---
#         > hostname = reg.mydomain.com
#         11c11
#         < ui_url_protocol = https
#         ---
#         > ui_url_protocol = http
#         23,24c23,24
#         < ssl_cert =  /home/harbor/certs/192.168.2.135.crt
#         < ssl_cert_key = /home/harbor/certs/192.168.2.135.ket
#         ---
#         > ssl_cert = /data/cert/server.crt
#         > ssl_cert_key = /data/cert/server.key
        
#         ./install.sh  #安装
#         完成后https://192.168.2.135 就能访问harbor ui

#         mkdir -p /etc/docker/cert.d/192.168.2.135/
#         cp ca.crt /etc/docker/cert.d/192.168.2.135/
#         docker login 192.168.2.135   #成功登陆

#         http方式: http方式较为简单,直接安装就行了,但是需要注意docker代理的问题
#         问题描述:我们在内网192.168.2.135服务器上部署了harbor,服务为http://192.168.2.135,通过路由器把135的80端口映射到公网ip:58.16.181.25:6000上,在但是公网的服务器需要访问harbor,
#         在公网上执行docker login 58.16.181.25:6000,报错信息如下:
#         Error response from daemon: Get http://58.16.181.25:6000/v2/: Get http://192.168.2.135/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry: 
#         net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (Client.Timeout exceeded while awaiting headers)
#         该问题需要在docker.service文件中添加docker Environment
#         Environment="HTTP_PROXY=58.16.181.25:6000"
#         可使用systemctl show --property Environment docker 查看docker服务的environment
#         如:systemctl show --property Environment docker
#               Environment=PATH=/opt/k8s/bin:/bin:/sbin:/usr/bin:/usr/sbin HTTP_PROXY=http://58.16.181.25:6000/







 

相关标签: kubernetes yaml