这边介绍trino在kubernetes上的安装,这个过程遇到了几个难缠的问题,耗费了3周左右,其实都是小问题,但是在部署的过程中没有考虑到,导致时间拉长了。
第一步使用trino363打包镜像,使用dockerfile,基本上与之前介绍的presto on kubernetes没有变化
FROM python
MAINTAINER 682556
RUN useradd --create-home --no-log-init --shell /bin/bash hive
RUN adduser hive sudo
RUN mkdir -p /opt
RUN mkdir -p /opt/presto/data
ADD wux-prestotest.seagate.com.p12 /opt //把证书添加到镜像中
ADD jdk.tar.gz /opt //把jdk11打入镜像
ADD trino-server-363.tar.gz /opt //把trino安装包打入镜像
ADD whiletrue.sh /opt/rcommand.sh //这个是定时检测trino服务的,如果服务掉了,再启动。这个可以自己写或者不写
ENV PRESTO_HOME /opt/trino-server-363
ENV JAVA_HOME /opt/jdk
ENV PATH $PATH:$JAVA_HOME/bin
EXPOSE 8080
RUN chmod -R 777 /opt
USER hive
ENTRYPOINT ["/opt/rcommand.sh"]
镜像打包之后,会有点大,没有做优化,上传到harbor,有问题的参照我之前的文章
configmap.properties,创建一个configmap,定义好各个配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: presto-config-cm
#namespace: ingress-nginx
labels:
app: presto-coordinator
data:
node.properties: |-
node.environment=staging
node.id=seadoop-trino-coordinator
node.data-dir=/opt/presto/data
jvm.config: |-
-server
-Xmx16G
-XX:-UseBiasedLocking
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
config.properties: |-
coordinator=${COORDINATOR_NODE}
node-scheduler.include-coordinator=true
http-server.authentication.type=PASSWORD
http-server.http.port=8080
query.max-memory=80GB
query.max-memory-per-node=4.8GB
query.max-total-memory-per-node=4.8GB
discovery-server.enabled=true
discovery.uri=http://presto-coordinator-service:8080
#http-server.log.max-history=2
#http-server.log.max-size=1MB
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/opt/wux-prestotest.seagate.com.p12
http-server.https.keystore.key=presto-seagate
log.properties: |-
io.trino=DEBUG
com.facebook.presto=DEBUG
io.airlift.discovery.client=DEBUG
password-authenticator.properties: |-
password-authenticator.name=file
file.password-file=/opt/trino-server-363/etc/password.db
presto-coordinator.yaml,主节点
apiVersion: apps/v1
kind: Deployment
metadata:
name: presto-coordinator
#namespace: ingress-nginx
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: presto-coordinator
template:
metadata:
labels:
app: presto-coordinator
spec:
#nodeSelector:
#type: lab1
#hostNetwork: true
containers:
- name: presto-coordinator
imagePullPolicy: Always
image: 10.38.199.203:8090/library/trino:363
ports:
- containerPort: 8080
env:
- name: COORDINATOR_NODE
value: "true"
volumeMounts:
- name: presto-config-volume
mountPath: /opt/bootstrap
readOnly: false
- name: presto-data-volume
mountPath: /opt/presto/data
readOnly: false
#readinessProbe:
#initialDelaySeconds: 10
#periodSeconds: 5
#httpGet:
#path: /ui
#port: 8099
volumes:
- name: presto-config-volume
configMap:
name: presto-config-cm
- name: presto-data-volume
emptyDir: {}
这里遇到一个问题,困扰了大概1周的时间。当时按照这个yaml去启动,并且在configmap中注释了https相关的配置,意思是使用http启动看是否成功,结果启动之后trino的log中一直报错,无法链接http://presto-coordinator-service:8080,discovery server一直起不来,问题原因是下面这个配置,这个配置是对pod内服务是否已经ok做校验的,如果发现pod内服务还没就绪,pod的就无法对外提供服务,即service在负载均衡的时候是不会将这样的pod考虑在内的,这就导致service无法路由到这个pod,导致pod内一直报错无法链接service。问题的原因是这个探活程序readinessProbe自身一直在报错,因为port:httpd这个配置是错误的,自己在报错,就不会将pod拉起,结果service也无法提供服务,这个问题因为自己对K8S的一些知识点还没有弄清楚导致花费了大量无用的时间在上面,这里我直接将这段注释了,再启动,成功。
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 5
httpGet:
path: /ui
port: httpd
presto-service.yaml
kind: Service
apiVersion: v1
metadata:
labels:
app: presto-coordinator
name: presto-coordinator-service
#namespace: ingress-nginx
spec:
type: NodePort
#sessionAffinity: ClientIP
ports:
- port: 8443
targetPort: 8443 //指向pod内部的https端口
name: https
#protocol: TCP
nodePort: 30013 //还需要向外暴露nodeport端口
selector:
app: presto-coordinator
要使用域名启动https链接,需要使用ingress的功能
首先将证书导入,可以选择全局的导入(多个namespace),也可以单个namespace
在rancher界面选中自己的namespace,我这里是default
点击resouces/secret,下面有一个证书导入的tab
添加证书,分别导入key和cert
导入完成,查看证书
在resouce/workload界面,转到load blance的tab,右上角添加ingress,填好namespace,service及ssl certificate
完成
使用域名及sercvie的nodeport暴露的端口30013访问trino
完成部署!
部署ingress的时候有个问题
首先我的域名wux-prestotest.seagate.com对应的是我的kubernestes的主节点10.38.199.202,这个主节点只有etcd和control panel的角色,没有给他赋值worker角色。此时我去用域名访问ingress的时候,总是不成功,无法显示网页。这个问题困扰了很久,在看了相关书籍了解到,在访问ingress的时候,是需要直接用worker节点的真实ip去访问的,就是要用某个worker所在node的ip去访问,因为ingress工作是根据ingress-controller的,ingress-controller默认是使用nginx转发的,而ingress-controller只有在worker节点才会安装,这导致我用主节点的域名去访问时,无法通过ingress-controller转发地址,所以访问不到service的服务,会报下面这样的错误,找不到service。
解决办法,我把主节点10.38.199.202设置成ALL的角色,即添加了worker角色,这样这个主节点上也会安装ingress-controller组件,那么在访问这个节点地址的时候,就可以用nginx进行转发了。这个也是关键的问题之一,切记。
202节点角色
ingress-controller