一.DockerFile:
1.结构:
基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
2.指令:
1).FROM:指定基础镜像,必须为第一个命令
    FROM <image>    #拉取最新镜像
  FROM <image>:<tag>
  FROM <image>@<digest>
2).MAINTAINER: 维护者信息
3).RUN:构建镜像时执行的命令
    shell执行
        格式:
            RUN <command>    #中间镜像会被缓存
            RUN <command> --no-cache
    exec执行
        格式:
            RUN ["executable", "param1", "param2"]
        示例:
            RUN ["executable", "param1", "param2"]
            RUN apk update
            RUN ["/etc/execfile", "arg1", "arg1"]
4).ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
   COPY:功能类似ADD,不会自动解压文件,也不能访问网络资源
    ADD <src>... <dest>
5).CMD:构建容器后调用,也就是在容器启动时才进行调用,CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
6).ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
7).EXPOSE:指定于外界交互的端口
8).VOLUME:用于指定持久化目录:目录挂载
9).WORKDIR:工作目录,类似于cd命令
10).ARG:用于指定传递给构建运行时的变量
    ARG <name>[=<default value>]
    
二.docker镜像

# MVN构建
mvn install -Dmaven.test.skip=true -X
# MVN构建项目(按依赖顺序构建父子项目)
mvn clean install -pl application -am -amd -U -Dmaven.test.skip=true
# 构建镜像    
docker build -f Dockerfile -t iam/iam-portal:version .
# 查看镜像ID
docker images
# 给本地仓库镜像打标签
docker tag imageId harbor/porject/application:version
# 推送镜像到harbor/dockerHub
docker push harbor/porject/application:version
# 拉取镜像
docker pull harbor/porject/application:version
# 验证镜像正确性:进入容器
docker run -it porject/application:version /bin/bash
# 删除镜像
docker rmi harbor/porject/application:version

三.mvn-docker

    <properties>
        <project.compiler.version>1.8</project.compiler.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <docker.repostory>${harbor}</docker.repostory>
        <docker.image.tag>dev-1.0.0</docker.image.tag>
        <docker.maven.plugin.version>1.4.10</docker.maven.plugin.version>
    </properties>
    
    <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>dockerfile-maven-plugin</artifactId>
        <version>1.4.13</version>
        <configuration>
            <username>harbor-username</username>
            <password>harbor-password</password>
            <repository>${harbor}/{project}/{application}</repository>
            <tag>1.0.0</tag>
            <buildArgs>
                <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
            </buildArgs>
        </configuration>
    </plugin>

四.ingress:
1.介绍:
K8S只支持和维护GCE或nginx类型Controller
2.类型:
1).Single Service Ingress:单体服务
2).Simple fanout:fanout基于请求的HTTP URI将配置流量从单个IP路由到多个服务,Ingress 是允许将负载平衡器的数量降到最低
    

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: simple-fanout-example
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: service1
              servicePort: 8081
          - path: /bar
            backend:
              serviceName: service2
              servicePort: 8080


3).虚拟host:支持将HTTP流量路由到在同一个IP上的多个hosName                  

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: name-virtual-host-ingress
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - backend:
              serviceName: service1
              servicePort: 80
      - host: bar.foo.com
        http:
          paths:
          - backend:
              serviceName: service2
              servicePort: 80


4).TLS:https
3.模板:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ .Values.deploy.app }}
  annotations:
    {{- range $key, $value := .Values.service.ingress.annotations }}
      {{ $key }}: {{ $value | quote }}
    {{- end }}
  labels:
    service-cluster: {{ .Values.deploy.serviceCluster }}
    app: {{ .Values.deploy.app }}
    project-type: java
spec:
  rules:
  # 可以有多个
  - host: {{ .hosts }}
    http:
      paths:
        # 可以有多个(可以正则)
        - path: {{ .path }}
          backend:
            serviceName: {{ .serviceName }}
            servicePort: {{ .servicePort }}
  # 可以有多个
  tls:
    # 可以有多个
    - hosts:
      {{- range .hosts }}
        - {{ . }}
      {{- end }}
      secretName: {{ .secretName }}

  
五.ConfigMap
1.configMap创建方式:
1).命令行中指定configmap参数创建: --from-literal
        kubectl create configmap configmapfileName --from-literal=db.host=10.5.10.116 --from-literal=db.port='3306'
2).指定文件:将一个配置文件创建为一个ConfigMap,可以有多个命令追加: --from-file=<file>
        kubectl create configmap test-config2 --from-file=./app.properties --from-file=NFilePathN...
3).指定目录:将一个目录下的所有配置文件创建为一个ConfigMap,忽略子目录: --from-file=<dir>
        kubectl create configmap test-config3 --from-file=./configs
4).已有的configmap的yaml文件:执行kubectl create -f 
2.configMap使用方式:
1).通过环境变量的方式直接传递给pod
(1).使用configmap中指定的key:使用valueFrom.configMapKeyRef.name/key指定要用的key

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]    #引用环境变量
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: env-config
              key: log_level
  restartPolicy: Never


(2).使用configmap中所有的key:通过envFrom.configMapRef.name使得configmap中的所有key/value对都自动变成环境变量

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]    #引用环境变量
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never


2).通过在pod的命令行下运行的方式(启动命令中)
3).作为volume的方式挂载到pod内

volumes:
 - name: config-volume4
   configMap:
    name: test-config4
     items:
     - key: my.cnf
       path: mysql-key
     - key: cache_host
       path: cache-host


3.注意事项:
更新 ConfigMap 后:
    使用该 ConfigMap 挂载的 Env 不会同步更新
    使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值,且同一个 namespace 中的 pod 的环境变量是不断累加的。
为了更新容器中使用 ConfigMap 挂载的配置,可以通过滚动更新 pod 的方式来强制重新挂载 ConfigMap,也可以在更新了 ConfigMap 后,先将副本数设置为 0,然后再扩容

六.Pod模板

apiVersion: v1                    #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 .
kind: Pod                      #必选,Pod
metadata:                      #必选,元数据
  name: string                    #必选,Pod名称
  namespace: string               #必选,Pod所属的命名空间,默认为"default"
  labels:                       #自定义标签
    - name: string                 #自定义标签名字
  annotations:                           #自定义注释列表
    - name: string
spec:                            #必选,Pod中容器的详细定义
  containers:                       #必选,数组,Pod中容器列表
  - name: string                        #必选,容器名称,需符合RFC 1035规范
    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
      nfs:                           #类型为NFS的存储卷
        server: 192.168.66.50        #nfs服务器ip或是域名 
        path: "/test"                #nfs服务器共享的目录
      persistentVolumeClaim:          #类型为persistentVolumeClaim的存储卷
        claimName: test-pvc           #名字一定要正确,使用的是kind为PersistentVolumeClaim中的name

七.service.yaml模板

apiVersion: v1            
kind: Service             
metadata:                 
  name: string            #service名称      
  namespace: string        
  labels:
    - name: string
  annotations:
    - name: string
spec:                   
  selector:            
    key: volume        
  type: string         #service的类型:service的访问方式:
                        #ClusterIp:虚拟服务集群IP:默认类型,用于k8s内部pod访问,在Node上kube-proxy通过设置的iptables规则进行转发
                        #NodePort:使用宿主机端口访问,外部访问
                        #LoadBalancer:使用外接负载均衡器完成负载分发,需要配合status.loadBalancer使用,公有云环境
                        #ingress:负载插件
  clusterIP: string
  sessionAffinity: string    #支持session:clusterIp
  ports:                    #service要暴露的服务端口
    - name: string            #端口名称
      protocol: string        #协议:TCP/UDP,默认TCP
      port: int                #服务监听端口号
      targetPort: int        #需要转发到后端pod的端口号
      nodePort: int            #当spce.type=NodePort时,指定映射到物理机端口
status:                        #外部负载配置
  loadBalancer:
    ingress:
      ip: string
      hostname: string


      
八.statefulSet.yaml模板
1.集群内访问:$(podname).(headless server name).namespace.svc.cluster.local
2.集群内访问:$(wordload).namespace:containerPort


九.容器配置
PostStart和PreStop是k8s为容器提供的对应的生命周期钩子函数,使得容器可以获知其所在运行环境对其进行管理的生命周期事件,以便容器可以响应该事件,并执行对应的代码。
PostStart在容器创建后将立刻执行并不能保证该钩子函数在容器的 ENTRYPOINT 之前执行,没有参数
例子:command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
ENTRYPOINT是指配置容器启动时的执行命令
PreStop在容器被 terminate(终止)之前执行,比如接口调用删除容器所在 Pod或者,当容器为completed 状态,preStop 调用将失败,k8s将在该函数完成执行之后才删除容器
cpu设置:
最小设置500m 一般设置1000m 较高设置 2000
#500m代表0.5CPU

安全设定:用来限制容器对宿主节点的可访问范围,以避免容器非法操作宿主节点的系统级别的内容,使得节点的系统或者节点上其他容器组受到影响。
相关参数:
runAsUser:容器的进程以UserID 【设定值】的身份运行,这个值是执行容器 entrypoint 进程的 UID,默认为 docker 引擎的 GID
runAsGroup:所有容器的进程都以GroupID 【设定值】 的身份运行,默认为GroupID为 root(0)
# root用户默认id
uid=0(root) gid=0(root) 组=0(root)

procMount:proc mount 的类型
capabilities:为容器内的进程授予某些特定的权限
seLinuxOptions:此字段设定的 SELinux 上下文将被应用到 Pod 中所有容器。如果不指定,容器引擎将为每个容器分配一个随机的 SELinux 上下文
例:
   capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]
        
DNS Policy:
  Default:Pod 从其所在的节点继承域名解析配置
  ClusterFirst:任何与集群域名后缀(例如 www.kubernetes.io)不匹配的 DNS 查询,都将被转发到 Pod 所在节点的上游 DNS 服务
  ClusterFirstWithHostNet:对于运行在节点网络上的 Pod,其 dnsPolicy 必须指定为 ClusterFirstWithHostNet
  None: 允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。此时,该 Pod 的 DNS 的所有设置必须通过 spce.dnsConfig 指定。
DNS Config:
  nameservers:Pod 的 DNS Server IP 地址列表。最多可以执行 3 个 IP 地址
  searches:Pod 中执行域名查询时搜索域的列表。该字段是可选的。如果指定了该字段,
  则指定的搜索域列表将与 DNS Policy 所产生的搜索域列表合并(重复的条目被去除)。合并后的列表最多不超过 6 个域。
  options:可选数组,其中每个元素由 name 字段(必填)和 value 字段(选填)组成。该列表中的内容将与 DNS Policy 所产生的 DNS 选项合并(重复的条目被去除)
hostIPC:使用宿主机的进程间通信名称空间
hostNetwork:使用宿主机的网络名称空间。如果设置为 true,则必须指定容器的 ports。
hostPID:使用宿主机的进程名称空间
shareProcessNamespace:容器组中所有的容器共享同一个进程名称空间(process namespace)
当 shareProcessNamespace 为 true 时,容器中的进程将可以
看到同一个容器组中其他容器的进程,并且相互发送信号。每一个容器中的
第一个进程的 PID 都将不是 1。hostPID 和 shareProcessNamespace 不能同时为 true。
此字段当前处于 beta 阶段,如果K8S 的 PodShareProcessNamespace 特性被禁用,
此字段将不再生效。

十.日志
    1.排查pod内部进程端口:

kubectl exec -it podname -n namespace -- ss -tnlp
curl -g -i -X GET 

     
十一.检查
initialDelaySeconds:表示的是说这个 pod 启动延迟多久进行一次检查,比如说现在有一个 Java 的应用:启动的时间可能会比较长,因为涉及到 jvm 的启动,包括 Java 自身 jar 的加载。所以前期,可能有一段时间是没有办法被检测的,而这个时间又是可预期的,那这时可能要设置一下 initialDelaySeconds;

periodSeconds:表示的是检测的时间间隔,正常默认的这个值是 10 秒;

timeoutSeconds:表示的是检测的超时时间,当超时时间之内没有检测成功,那它会认为是失败的一个状态;

successThreshold:表示的是:当这个 pod 从探测失败到再一次判断探测成功,所需要的阈值次数,默认情况下是 1 次,表示原本是失败的,那接下来探测这一次成功了,就会认为这个 pod 是处在一个探针状态正常的一个状态;

failureThreshold:表示的是探测失败的重试次数,默认值是 3,表示的是当从一个健康的状态连续探测 3 次失败,那此时会判断当前这个pod的状态处在一个失败的状态

# 此处属于容器组配置,是containers属性配置项
    spec:
      containers:
        - env:
            - name: JAVA_OPTS
              value: >-
                -Xmx2g -Xms2g -Xmn1024m -XX:+UseConcMarkSweepGC
                -XX:+HeapDumpOnOutOfMemoryError
                -XX:CMSInitiatingOccupancyFraction=70
                -XX:+UseCMSInitiatingOccupancyOnly
                -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGC
                -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
                -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC
                -XX:+PrintTenuringDistribution
                -XX:+PrintGCApplicationStoppedTime -Xloggc:gc.log
                -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
                -Dspring.profiles.active={profile}
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
          image: {image}
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop:
              exec:
                command: # 加入- bash 适配centos原生的操作系统的命令
                  - bash
                  - /stop.sh
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /actuator/health/liveness
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 120
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 2
          name: {rs-name}
          ports:
            - containerPort: 8080
              name: admin-port
              protocol: TCP
          readinessProbe:
            failureThreshold: 5
            httpGet:
              path: /actuator/health/readiness
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 120
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 2
          resources:    # 容器指标配置
            limits:
              cpu: '2'
              memory: 4Gi
            requests:
              cpu: 1000m
              memory: 4Gi

十二.Pipeline

# groovy 脚本
pipeline {
    agent any

    environment {
        REPOSITORY=${GIT}
        MODULE=${PROJECT}
        ENVRMT=S{ACTIVE_FILE}
        NAMESPACE=${Harbor_Project}
        KIND=${Kutesnetes_kind_type}
        SCRIPT_PATH=${jenkins_sh_path}
    }

    stages {

        stage('拉取代码') {
            steps {
                echo "start fetch code from git:${REPOSITORY}"
                deleteDir()
                script {
                    checkout([$class: 'GitSCM', branches: [[name: "$ENVRMT"]], userRemoteConfigs: [[credentialsId: ${k8s-jenkins-auth-ID}, url: "$REPOSITORY"]]])
                }
            }
        }

        stage('代码静态检查') {
            steps {
                echo "start code check"
            }
        }

        stage('编译+单元测试') {
            steps {
				// 忽略
                echo "start compile"
                sh "source /etc/profile && cd $MODULE && mvn clean install package -U -Dmaven.test.skip=true"
            }
        }

        stage('构建上传镜像') {
            steps {
                echo "start build image"
                sh "${SCRIPT_PATH}/build_image.sh $MODULE $NAMESPACE"
            }
        }

        stage('发布到K8S') {
            steps {
                echo "start deploy"
                sh "${SCRIPT_PATH}/deploy.sh $NAMESPACE $KIND $MODULE $MODULE "
            }
        }
    }
}

 

Logo

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

更多推荐