Kubernetes deployment模板 发表于 2019-07-02 | 更新于: 2019-07-02 | 分类于 Kubernetes | 阅读次数: 字数统计: 1.3k说明官方文档里面的deployment样例比较简单实际上deployment的配置选项非常的多这里做一下记录Dockerfile123FROM openjdk:8-jre-slimADD ./demo.jar /home/demo.jar模板123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197# 定义APP环境变量apiVersion: v1kind: ConfigMapmetadata: # 定义配置文件的名称 name: java-app-configmap # 定义运行在哪个命名空间 namespace: default labels: # 定义标签,后面可以通过标签选择器筛选 app: java-appdata: # 定义数据库连接地址和端口 DB_HOST: "mysql-svc.default.svc.cluster.local" DB_PORT: "3306"---apiVersion: apps/v1beta2kind: Deploymentmetadata: name: java-app # 定义运行在哪个命名空间 namespace: default labels: app: java-appspec: selector: matchLabels: app: java-app # 设置副本数量 replicas: 1 template: metadata: labels: app: java-app spec: # 禁止自动挂载kubernetes的ServiceAccount # 理解为禁止app通过kubernetes内建的ServiceAccount访问kubernetes集群 automountServiceAccountToken: false # 从镜像库拉镜像时使用用户名密码认证 imagePullSecrets: [] # 定义亲和性,调整调度策略 affinity: # 容器反亲和性 podAntiAffinity: # preferredDuringSchedulingIgnoredDuringExecution # 优先部署在满足条件的节点,如不满足则忽略条件继续调度 preferredDuringSchedulingIgnoredDuringExecution: # 这里定义亲和规则 # 调度时会检查候选节点上是否有带有app=java-app的app,权重为100 # 这里定义的是AntiAffinity,效果为同一个app在同一个节点上是互斥的 # 实现同一个app不会集中在同一个节点 # 极端情况下,节点数量不够,无法满足条件时,会忽略prefer规则,按照正常流程调度 - podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - java-app # 这里是作用域,没啥事不用调 topologyKey: "kubernetes.io/hostname" weight: 100 # 配置Pod挂载的卷和名字 volumes: # 这里定义Pod可以挂载哪些volume,容器挂载的volume要在这里定义好才可以使用 - name: timezone-volume # 定义宿主机文件路径 hostPath: path: /usr/share/zoneinfo/Asia/Shanghai # 容器初始化操作 initContainers: # 用于检测数据库就绪状态 # 检查条件为数据库服务器端口是否可达 - name: wait-for-db image: busybox:1.28 imagePullPolicy: IfNotPresent envFrom: # 这里从configmap里面获取环境变量 - configMapRef: name: java-app-configmap # 这里是容器初始化时,通过循环检查数据库是否就绪 command: - /bin/sh - -c - "until nc -zv $(DB_HOST) $(DB_PORT) -w1; do echo 'waiting for db'; sleep 1; done" # 启动容器 containers: # 业务容器 - name: java-app image: java-app:v1 # 镜像拉取策略 # IfNotPresent 如果没有就拉镜像 # Always 总是拉镜像,即使节点本地有镜像 # Nerver 不拉镜像 imagePullPolicy: IfNotPresent # 定义容器资源需求 resources: # 资源限制,超过限值会被杀掉 limits: # 限制CPU用量 # 1个核心的CPU等于1000m,这样多个容器是通过CPUShare共享CPU计算资源 # 如果直接写数字(1、2、3)这样的话,会被认为是将容器独占CPU核心 cpu: "1500m" # 限制容器最大内存用量 # 内存为不可压缩资源,超过限制会因为Out-Of-Memory被杀掉 # jdk-8u131+以上的版本可以通过强制检查Linux cgroup配置 memory: "2Gi" # Pod调度时会参考这里的资源需求调度 requests: # 限制CPU用量 # 1个核心的CPU等于1000m,这样多个容器是通过CPUShare共享CPU计算资源 # 如果直接写数字(1、2、3)这样的话,会被认为是将容器独占CPU核心 cpu: "100m" memory: "2Gi" env: # 这里定义JAVA_OPTS来让jvm启动时自动识别容器资源限值,然后计算出匹配的运行参数 # -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap开启openjdk8的实验特性以正确识别docker资源限值 # -XX:MaxRAMFraction默认值为4,即Heapsize为内存的25%,这里设置为2,即Heapsize为内存的50% # 可以通过-Xmx来指定jvm可使用的最大堆 - name: JAVA_OPTS value: "-Xmx1800m" # value: "-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2" # 这里使用kubernetes的downwardAPI获取Pod的信息 # 对于某些APP需要获取Pod自身信息时可以直接调用环境变量 # Pod所在宿主机名字 - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName # Pod所在宿主机IP地址 - name: NODE_IP valueFrom: fieldRef: fieldPath: status.hostIP # Pod名字 - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name # PodIP地址 - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP envFrom: # 这里直接从configmap里面获取环境变量 # 可以在command字段里面使用 # 具体定义了哪些环境变量,可以在configmap那里看到 - configMapRef: name: java-app-configmap # 设置容器工作目录 workingDir: /home # 设置容器启动命令和参数 command: - /usr/bin/java - -Djava.security.egd=file:/dev/./urandom - -Duser.timezone=Asia/Shanghai - -Xloggc:logs/gc.log - -jar - /home/demo.jar # 定义容器端口 ports: # 这里定义的端口别名可以在其他地方直接调用 - name: http # 定义容器运行时监听的端口,需要与Service的targetPort对应 containerPort: 8080 protocol: TCP # 定义容器存活探针 livenessProbe: # 使用TCP端口探测 tcpSocket: # 定义检查端口,可以写端口别名,也可以写端口号 port: 8080 # 容器初始化完成后延迟检测,单位秒 # 防止app启动时间过久导致被k8s判断为fail直接干掉 initialDelaySeconds: 60 # 检测频率 periodSeconds: 10 # 定义容器就绪探针 readinessProbe: # 使用HTTP GET请求 httpGet: path: /healthz port: 8080 httpHeaders: - name: readinessProbe value: k8s # 容器初始化完成后延迟检测,单位秒 # 防止app启动时间过久导致被k8s判断为fail直接干掉 initialDelaySeconds: 60 # 检测频率 periodSeconds: 10 # 把定义好的数据卷挂载到容器里面 volumeMounts: - name: timezone-volume # 这里用于配置容器的时区为Asia/Shanghai mountPath: /etc/localtime本文作者: 乱愣黎本文链接: https://luanlengli.github.io/2019/07/02/Kubernetes-deployment模板.html版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!