K8S
一.DockerFile:1.结构:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令2.指令:1).FROM:指定基础镜像,必须为第一个命令FROM <image> #拉取最新镜像 FROM <image>:<tag> FROM <image>@<digest>2).MAINTAINER: 维护者信息3).RUN:构建镜像时
一.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 "
}
}
}
}
更多推荐
所有评论(0)