一、yaml文件内容解析
--- #这个---代表的通常是一个资源(pod或者配置)
apiVersion: apps/v1
kind: Deployment #部署类型
metadata:
name: test
namespace: default # 部署的命名空间
labels:
app: test
spec:
replicas: 1 # 启动1个pod实列
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
imagePullSecrets:
- name: tencent-docker-secret # 镜像拉取密钥
restartPolicy: Always # 当pod出现故障的策略,重启策略 always:总是重启,nerver:容器退出从不重启,onfailure:当容器异常退出时重启
hostAliases: # 功能与hosts文件映射一样
- ip: "127.0.0.1"
hostnames:
- "hello.google.com"
dnsPolicy: Default
containers: # 容器的信息
- name: test # 容器的名称
image: ccr.ccs.tencentyun.com/zflzqy/test:latest # 容器的镜像地址
imagePullPolicy: Always # 镜像拉取策略
ports:
- containerPort: 8080 #容器的端口
readinessProbe: #就绪策略,通常用于让k8s集群判断该pod是否正常启动了
httpGet: #http检查策略
port: 8080
path: /
initialDelaySeconds: 60 # 在容器部署多少秒之后执行检查策略
periodSeconds: 30 # 每次容器就绪检测间隔,默认3
successThreshold: 1 # 检测失败后,再次连续成功多少次视为成功,默认1
failureThreshold: 10 # 允许失败次数,
livenessProbe: # 配置与就绪一样,不过这里代表的是容器是否存活(容器是否正常)
httpGet:
path: /
port: 8080
initialDelaySeconds: 60
periodSeconds: 20
resources: # 容器资源限制
limits:
cpu: 1 # cpu 最大1个
memory: 400Mi # 内存限制策略最大
requests:
memory: 100Mi
cpu: 0.5 # 请求0.5个,一般这个要比最大小
volumeMounts:
- mountPath: /config #容器内部目录
name: config #与下边的名字一致
- mountPath: /logs #容器内部目录
name: log #与下边的名字一致
volumes:
- name: config #卷名称
nfs: #使用NFS网络存储卷
server: 10.0.4.11 #NFS服务器地址
path: /opt/project/nfs/test/config #NFS服务器共享的目录
readOnly: true #是否为只读
- name: log #卷名称
nfs: #使用NFS网络存储卷
server: 10.0.4.11 #NFS服务器地址
path: /opt/project/nfs/test/logs #NFS服务器共享的目录
readOnly: false #是否为只读
---
apiVersion: v1
kind: Service # 这里代表的是一个service,通常一个service下会有多个pod
metadata:
name: test-service # service的名字
spec:
selector:
app: test # 选择的pod的名称
ports:
- protocol: TCP
port: 8080 # pod端口
targetPort: 8080 # service端口
# nodePort: 30081 # 绑定节点的端口
---
apiVersion: networking.k8s.io/v1 # nginx负载均衡,用于对service的负载均衡,可以根据域名或后缀将流量转发到不同的service上,
kind: Ingress
metadata:
name: ingress-test-service
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls: # https的证书配置,需要配合k8s命令中的证书导入
- hosts:
- test.zflzqy.cn
secretName: test-zflzqy-cn-tls
rules:
- host: test.zflzqy.cn #当访问的域名是这个的时候,讲流量转发到下边的services
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: test-service
port:
number: 8080
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler # hpa动态伸缩
metadata:
name: test
spec:
scaleTargetRef: # 指定选择的容器
apiVersion: apps/v1
kind: Deployment # 容器部署形式
name: test # 部署的名称
minReplicas: 1 # 最小多少个pod,kind: Deployment的metadata的name属性
maxReplicas: 10 # 最大多少个pod
targetCPUUtilizationPercentage: 80 # 机器cpu占用到多少百分比进行扩容
1.2、使用裸ip进行访问配置:
---
apiVersion: networking.k8s.io/v1 # nginx负载均衡,用于对service的负载均衡,可以根据域名或后缀将流量转发到不同的service上,
kind: Ingress
metadata:
name: ingress-test-service
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
#tls: # https的证书配置,需要配合k8s命令中的证书导入
# - hosts:
# - test.zflzqy.cn
# secretName: test-zflzqy-cn-tls
rules:
#- host: test.zflzqy.cn #当访问的域名是这个的时候,讲流量转发到下边的services
- http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: test-service
port:
number: 8080
1.3、前缀重定向(移除匹配的前缀)
下边的例子当使用ip/aa这样进行访问的时候就会定向test-service服务,并且移除aa前缀,这样我们的项目就不需要加后缀
---
apiVersion: networking.k8s.io/v1 # nginx负载均衡,用于对service的负载均衡,可以根据域名或后缀将流量转发到不同的service上,
kind: Ingress
metadata:
name: ingress-test-service
annotations:
kubernetes.io/ingress.class: "nginx"
inginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
#tls: # https的证书配置,需要配合k8s命令中的证书导入
# - hosts:
# - test.zflzqy.cn
# secretName: test-zflzqy-cn-tls
rules:
#- host: test.zflzqy.cn #当访问的域名是这个的时候,讲流量转发到下边的services
- http:
paths:
- pathType: Prefix
path: /aa
backend:
service:
name: test-service
port:
number: 8080
二、应用访问
2.1、在java应用中如何让k8s中启动的应用与jar启动的应用进行通信(通常为了解决nacos这种注册中心下的远程过程服务调用的网络问题)
---
apiVersion: v1
kind: Service # 这里代表的是一个service,通常一个service下会有多个pod
metadata:
name: test-service # service的名字
spec:
selector:
app: test # 选择的pod的名称
ports:
- protocol: TCP
port: 8080 # pod端口
targetPort: 8080 # service端口
# nodePort: 30081 # 绑定节点的端口
使用nodePort暴露服务的端口,在注册到nacos的时候ip填写集群内任意节点的ip,端口为当前nodePort的值。这样其他以jar形式部署的应用就可以通过服务暴露的ip进行访问pod
2.2、集群内机器可以通过k8s提供的dns服务进行相互通信 ..svc.cluster.local:8080这种形式做到访问,其中 serviceNamed的值为Kind等于Service配置中的name属性,namespace是容器运行在k8s空间的名称,svc.cluster.local是固定后缀,targetPort 是容器的名称或者容器的端口。port为服务暴漏的端口。
注:Ingres是七层代理,Service是4层代理
2.3、dnsPolicy策略说明
值 | 说明 |
---|---|
Default | 默认策略,Pod 从运行所在的节点继承名称解析配置 |
ClusterFirst | 与配置的集群域后缀不匹配的任何 DNS 查询(例如 “www.kubernetes.io”) 都会由 DNS 服务器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器 |
ClusterFirstWithHostNet | 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 “ClusterFirstWithHostNet”。否则,以 hostNetwork 方式和 “ClusterFirst” 策略运行的 Pod 将会做出回退至 “Default” 策略的行为 |
None | 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置 |
2.4、ingress配置前缀去除,以下代码在应用重定向到pod时候不会携带appServer
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-im-app-server-service
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/proxy-body-size: 6000m
# URL重定向。
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
- hosts:
- zflzqy.cn
secretName: zflzqy-cn-tls
rules:
- host: zflzqy.cn
http:
paths:
- pathType: Prefix
path: /appServer(/|$)(.*)
backend:
service:
name: zflzqy-server-service
port:
number: 8888```