Kubernetes
请看文档:https://www.kubernetes.org.cn/k8s
Kubernetes
(通常称为K8s
) 是开源容器集群管理系统,用于自动部署、扩展和管理容器化 应用程序。
Rancher
示范
sudo docker run -itd --privileged --restart=unless-stopped -p 8080:80 -p 8443:443 -v /home/cyy/rancher:/var/lib/rancher/ -e CATTLE_AGENT_IMAGE="registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.4.8" registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.4.8
nginx
and alpine
nginx:1.18-alpine
docker pull alpine:3.12
docker run -d --name tt \
-v /home/cyylog/myweb:/app \
-w /app \
-p 8081:80 \
alpine:3.12 \
./myserver
Redis
第一步:首先创建文件夹
[cyy@cyylog1 n1]$ tree /home/cyy/redis
/home/cyy/redis
├── n1
│ ├── conf
│ │ └── redis.conf
│ ├── data (用来存放数据目录)
│ └── logs (用来存放日志)
└── redis.conf
其中配置文件中
daemonize no (不以守护进程启动)
port 6379
bind 0.0.0.0
logfile /logs/redis.log (日志文件)
dir /data (数据目录)
第二步:在Nfs服务器上export 文件夹
sudo vi /etc/exports
加入如下一行:
在 /home/cyylog/redis 192.168.0.0/24(rw,async,insecure,no_root_squash)
然后执行 exportfs -a
或(sudo systemctl restart nfs.service)
重新加载配置
redis镜像
我们还是使用redis:5-alpine
为了速度,大家可以提前pull下来
docker pull redis:5-alpine
映射
映射
n1/conf:/conf
n1/data:/data
n1/logs:/logs
注意:n1 是 子目录 前面不要加 /
启动命令
redis-server /conf/redis.conf
registry
镜像地址:https://hub.docker.com/_/registry
基本运行
docker run -d --name registry \
-v /home/cyy/registry/config.yml:/etc/docker/registry/config.yml \
-v /home/cyy/registry/data:/var/lib/registry \
-p 5000:5000 registry
也可以直接 用k8s 安装一个单机的 容器
配置文件
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
测试
找个已经有的镜像,打个tag
docker tag redis:5-alpine 192.168.0.129:5000/redis:v1
传到我们的私有镜像里
docker push 192.168.0.129:5000/redis:v1
sha256:9e0926fe90cef2fc4e435fbcb63c273d34ac9b05de6545cb92d708ccdb7f823f
查看API(https://docs.docker.com/registry/spec/api/#listing-repositories)
curl http://192.168.0.129:5000/v2/_catalog (查看列表)
curl http://192.168.0.129:5000/v2/redis/manifests/v1 (查看redis镜像详情)
curl http://192.168.0.129:5000/v2/redis/tags/list
curl -X DELETE http://192.168.0.129:5000/v2/redis/manifests/xxx
垃圾回收:registry garbage-collect /etc/docker/registry/config.yml
设置安全
不出意外会报一个 错误http: server gave HTTP response to HTTPS client
那是因为docker为了安全,需要https 。但是我们可以让其不需要
要修改的是/etc/docker/daemon.json
{
"insecure-registries":["192.168.0.129:5000"]
}
然后重载docker 即可systemctl reload docker
下载镜像
docker pull 192.168.0.129:5000/redis:v1
~~~##### CI/CD
###### 搭建`gitlab`
~~~shell
docker pull gitlab/gitlab-ce
创建专属pv
sudo vi /etc/exports
加入一行
/home/cyy/gitlab 192.168.0.129/24(rw,async,insecure,no_root_squash)
然后执行 sudo exportfs -a 重新加载配置
[cyy@cyylog1 gitlab]$ pwd # 的子目录
/home/cyy/gitlab
[cyy@cyylog1 gitlab]$ tree .
.
├── config
├── data
└── logs
挂载内容
/etc/gitlab config
/var/opt/gitlab data
/var/log/gitlab logs
配置负载均衡时 别忘了加:
nginx.ingress.kubernetes.io/rewrite-target
使用gitlab
请各位通过百度查询 自行生成生成SSH key
并通过如下测试:
ssh -T git@git.cyylog.cn -p 30022 (注意 ,这有个端口,22被主机的SSH占用了,你懂的)
ssh-keygen -t rsa -C "cyylog@163.com"
项目中执行
1、git init
2、
git config --global user.name "cyylog"
git config --global user.email "cyylog@163.com"
先pull下来
注意:最终的地址是这样的
ssh://git@git.cyylog.cn:30022/cyylog/mygo.git
git pull origin master --allow-unrelated-histories
gitlab-runner
随便找台机器 执行
docker pull gitlab/gitlab-runner
然后创建一个文件夹 /home/cyy/gitlab-runner
docker run -d --name gitlab-runner \
-v /home/cyy/gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner
接下来执行
docker exec -it gitlab-runner gitlab-runner register
# vi .gitlab-ci.yml
stages:
- test
- build
job1:
stage: test
script:
- echo "it is test"
job2:
stage: build
script:
- echo "it is build"
各种参数
script 由Runner执行的Shell脚本。
image 使用docker镜像, image:name
service 使用docker services镜像, services:name
before_script 执行作业前运行的脚本
after_script 作业完成后运行的脚本
stages 定义管道中的步骤,依次运行
stage 定义管道中步骤的作业段
only 指定作业限制only:refs,only:kubernetes,only:variables,和only:changes
tags 指定执行作业的runner
allow_failure 允许job失败
when 什么时候开始工作,
on_success 只有当前一个阶段的所有工作都成功时(或者因为它们被标记而被认为是成功的allow_failure)才执行工作 。这是默认值。
on_failure 仅当前一阶段的至少一个作业失败时才执行作业。
always 无论先前阶段的工作状态如何,都可以执行工作。
manual 手动执行作业
delayed 延迟作业。后面跟start_in,start_in 30minutes(延迟30分钟),不加单位,默认为秒。最长可延迟1小时。
environment 作业部署到的环境名称 #暂未搞清
cache
key:"$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" #为每分支,每步骤启用缓存
artifacts job成功时附加到作业的文件或目录
dependencies 此job依赖其他jobz,主要作用于作业优先级
converage 给定作业代码覆盖率设置
retry 在发生故障时,可以自动重试作业的次数。
parallel 应该并行运行多少个作业实例
trigger 定义下游管道触发器
include 允许此作业包含外部YAML
extends 此作业将继承的配置项
pages 上传作业结果用于gitlab pages
variables 作业级别定义作业变量
编译Go程序、打包镜像
把上面的容器删掉
centos7 (阿里云)
docker run -d --name gitlab-runner \
-v /home/cyylog/gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
gitlab/gitlab-runner
并在宿主机上执行 :chmod 666 /var/run/docker.sock
stages:
- test
job1:
stage: test
script:
- docker build -t mygo:v1 .
tags:
- go
Docker file
FROM golang:1.14.4-alpine3.12
RUN mkdir /src /app
ADD . ../src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o ../app/mygo main.go && cd /app && chmod +x mygo && cd /
RUN rm src -fr
WORKDIR /app
ENTRYPOINT ["/app/mygo"]
打包Go镜像、瘦身镜像
新的 Dockerfile
FROM golang:1.14.4-alpine3.12
RUN mkdir /src /app
ADD . ../src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o ../app/mygo main.go && cd /app && chmod +x mygo && cd /
FROM alpine:3.12
RUN mkdir /app
COPY --from=0 /app/mygo /app
ENTRYPOINT ["/app/mygo"]
打包Go镜像、加入单元测试
编辑 .gitlab-ci.yml
stages:
- test
- build
GoTest:
stage: test
script:
- docker build -f DockerfileTest -t test-mygo:v1 .
- docker run --rm test-mygo:v1
after_script:
- docker rmi test-mygo:v1
tags:
- go
GoBuild:
stage: build
script:
- docker build -t mygo:v1 .
after_script:
- docker rmi $(docker images -af "dangling=true" -q)
tags:
- go
Dockerfile
FROM golang:1.14.4-alpine3.12
RUN mkdir /src
ADD . /src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o mygo main.go && chmod +x mygo
FROM alpine:3.12
RUN mkdir /app
COPY --from=0 /src/mygo /app
ENTRYPOINT ["/app/mygo"]
DockerfileTest
FROM golang:1.14.4-alpine3.12
ADD . /src
WORKDIR /src
cmd ["go","test"]
打包Go镜像、发布到私有镜像库
编辑 .gitlab-ci.yml
添加deploy
GoDeploy:
stage: deploy
script:
- docker tag mygo:v1 192.168.0.129:5000/mygo:v1
- docker push 192.168.0.129:5000/mygo:v1
after_script:
- docker rmi 192.168.0.129:5000/mygo:v1
- docker rmi mygo:v1
tags:
- go
Dockerfile
FROM golang:1.14.4-alpine3.12
RUN mkdir /src
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add build-base
ADD . /src
RUN cd /src && ls && GOPROXY=https://goproxy.cn go build -o mygo main.go && chmod +x mygo
FROM alpine:3.12
RUN mkdir /app
COPY --from=0 /src/mygo /app
ENTRYPOINT ["/app/mygo"]
DockerfileTest
FROM golang:1.14.4-alpine3.12
ADD . /src
WORKDIR /src
ENV GOPROXY=https://goproxy.cn
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add build-base
cmd ["go","test"]
查看仓库
curl http://192.168.0.129:5000/v2/_catalog (查看列表)
curl http://192.168.0.129:5000/v2/镜像名/manifests/v1 (查看redis镜像详情)
curl http://192.168.0.129:5000/v2/mygo/tags/list
打包镜像、自动更新服务
修改runner
docker run -d --name gitlab-runner \
-v /home/cyy/gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
-v /usr/local/bin/kubectl:/usr/local/bin/kubectl \
-v /home/cyy/kubectlconfig/config:/kubeconfig \
-e KUBECONFIG=/kubeconfig \
gitlab/gitlab-runner
(请自行删除容器后 重新创建)
熟悉以下命令
1、kubectl get pod -n myweb| grep mygo
2、kubectl get pod -n myweb| grep mygo | awk '{print $1}'
3、 kubectl get pod -n myweb| grep mygo | awk '{print $1}' | xargs kubectl delete pod -n myweb
加入配置 .gitlab-ci.yml
GoPub:
stage: publish
script:
- kubectl get pod -n myweb| grep mygo | awk '{print $1}' | xargs kubectl delete pod -n myweb
tags:
- go
灰度发布
那么现在我们要干的事 是设置 一部分流量
添加这个标签
nginx.ingress.kubernetes.io/canary-weight
设置如下标签
Nginx –Ingress ,支持配置 标签来实现不同场景下的灰度发布和测试。
主要使用如下标签
nginx.ingress.kubernetes.io/canary
nginx.ingress.kubernetes.io/canary-by-header
nginx.ingress.kubernetes.io/canary-by-header-value
nginx.ingress.kubernetes.io/canary-weight
nginx.ingress.kubernetes.io/canary-by-cookie
3步一键创建services
pub.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mygo
namespace: myweb
spec:
selector:
matchLabels:
app: mgo
replicas: 1
template:
metadata:
labels:
app: mgo
spec:
containers:
- name: mygo
image: 192.168.0.129:5000/mygo:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: mygo-service
namespace: myweb
spec:
selector:
app: mgo
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mygolb
namespace: myweb
spec:
rules:
- host: api2.cyylog.cn
http:
paths:
- path: /
backend:
serviceName: mygo-service
servicePort: 80
ETCD
单体部署etcd到k8s中
镜像地址
etcd是一个高可用的键值存储系统,场景主要是
1、主要用于共享配置
2、服务注册与发现
3、分布式锁等
etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 等。它使用Go语言编写
https://quay.io/repository/coreos/etcd?tag=latest&tab=tags
先pull镜像
Red Hat运营的镜像库
docker pull quay.io/coreos/etcd:v3.3.25
由于不可描述的原因,一般你是干不下来的。
于是可以用中科大的地址:
docker pull quay.mirrors.ustc.edu.cn/coreos/etcd:v3.3.25
(不一定稳定,不能用则自己打包)
修改tag
1、docker tag quay.mirrors.ustc.edu.cn/coreos/etcd:v3.3.25 etcd:3.3.25
2、docker rmi quay.mirrors.ustc.edu.cn/coreos/etcd:v3.3.25
接下来
在我们之前做的nfs-server中 创建文件夹
1、首先创建一文件夹 : /home/cyy/etcdconf
2、cd进入后,再创建 etcd1目录
目录结构是
[cyy@cyylog1 etcdconf]$ pwd
/home/cyy/etcdconf
[cyy@cyylog1 etcdconf]$ tree .
.
└── etcd1
├── conf
└── data
配置nfs-server
sudo vi /etc/exports
加入配置(具体看视频演示)
然后执行 sudo exportfs -a 重新加载配置
查看
showmount -e 192.168.0.129
单机配置文件
使用cm配置即可
name: etcd1
data_dir: /etcd/data
listen-client-urls: http://0.0.0.0:2379
启动命令 是 etcd --config-file /etcd/conf/etcd.yaml
golang测试连接etcd
客户端库
https://github.com/etcd-io/etcd/tree/master/clientv3
go get go.etcd.io/etcd/clientv3
(如果有版本冲突,可以降低grpc的库
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0 )
测试连接
export ETCDCTL_API=3 切换为API3
etcdctl get /service/test
使用nginx-ingress反代etcd
原理
Ingress Controller监听
两个configmap(tcp和udp),可以设置反代的TCP暴露的端口。当修改并且发生变化后,Ingress controller会去更改Nginx的配置,增加对应的监听
格式
端口::
于是我们加入 一个配置:
key是 32379对应的值是 myweb/etcd1:2379
创建etcd集群(3个节点)
之前的配置
name: etcd1
data_dir: /etcd/data
listen-client-urls: http://0.0.0.0:2379
单机的话比较简单
基本配置
name: etcd1
data-dir: /etcd/data
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://0.0.0.0:2379
listen-peer-urls: http://0.0.0.0:2380
initial-advertise-peer-urls: http://etcd1:2380
initial-cluster-token: 'etcd-cluster'
initial-cluster: etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
initial-cluster-state: 'new'
基本配置说明
listen-client-urls:etcd监听url和端口
advertise-client-urls:etcdctl或curl等客户端工具交互时用的url地址(一般和上面的一样)
listen-peer-urls: 节点通信地址, 如:Leader 选举、Message消息传输、快照等。
initial-advertise-peer-urls:同上
initial-cluster-token:集群唯一标识
initial-cluster:集群中所有的initial-advertise-peer-urls的合集。
initial-cluster-state:新建集群的标识。
创建是别忘了加上环境变量:
ETCDCTL_API =3
启动命令 是 etcd --config-file /etcd/conf/etcd.yaml
基本情况查询
查看节点列表
etcdctl -w table member list
查看单节点信息
etcdctl -w table endpoint status
查看全部
etcdctl -w table --endpoints=etcd1:2379,etcd2:2379,etcd3:2379 endpoint status
sidecar
SideCar 是在 Pod 中延伸或增强主容器的 容器。主容器和 Sidecar 共享一个 Pod,可以共享相同的网络空间和存储空间
第一步:
首先利用
nginx:1.18-alpine 。随随便便创建一个nginx服务
接下来就可以查看日志了
默认目录在 /var/log/nginx下
注意:请不要做任何改变
接下来
我做了一个 很随便 很随意的 go程序
交叉编译到linux中 。。 然后使用alpine:3.12 挂载启动
r:=gin.New()
r.Use(func(context *gin.Context) {
defer func() {
if e:=recover();e!=nil{
context.JSON(400,gin.H{"error":e})
}
}()
context.Next()
})
r.GET("/", func(context *gin.Context) {
context.JSON(200,gin.H{"message":"index"})
})
r.Run("0.0.0.0:8080")
emptydir
文档
https://kubernetes.io/zh/docs/concepts/storage/volumes/#emptydir
配置方式
我们需要打开yaml的方式来进行配置
在主容器上写入 (和image 同级)
volumeMounts:
- mountPath: /var/log/nginx
name: nginx-log
SideCar中也写入
volumeMounts:
- mountPath: /app
name: vol4
- mountPath: /var/log/nginx
name: nginx-log
最后加入
volumes:
- emptyDir: {}
name: nginx-log
- name: vol4
persistentVolumeClaim:
claimName: gopvc
ELK
filebeat
用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 数据库中
配置文档指引:
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html它属于beats家族成员之一
看github地址https://github.com/elastic/beats包含了Packetbeat收集网络流量数据、Metricbeat收集系统、进程的CPU、内存使用情况等数据、Filebeat收集文件数据 等等
安装文档:
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation-configuration.html
我们后面采用docker的方式安装:
https://www.elastic.co/guide/en/beats/filebeat/current/running-on-docker.html
我们先在每个节点上执行 docker pull docker.elastic.co/beats/filebeat:7.10.0
这样可以加快点速度
基本的配置--input
千万不要背
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/access.log
放到configmap里面
基本的配置--output
千万不要背
https://www.elastic.co/guide/en/beats/filebeat/current/console-output.html
output.console:
pretty: true
放到configmap里面
基本的是这样的
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
output.console:
pretty: true
setup.template.enabled: false
scan_frequency: 2s
ElasticSearch
部署单体ElasticSearch
安装文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/docker.html我们先在每个节点上执行 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.4.2
这样可以加快点速度
接下来的步骤
我们新开一个命名空间 叫做 elk
docker run --rm --name testes -it docker.elastic.co/elasticsearch/elasticsearch:7.4.2 sh
进去后可以看到 ,es的配置文件主要在:
/usr/share/elasticsearch/config
我们把他们都拷贝下来
cd /usr/share/elasticsearch/config && cat elasticsearch.yml
mkdir myes
然后创建一个文件夹叫做 es1 (猜也能猜出 我们后面要创建集群)
就拷贝到这个地方
docker cp testes:/usr/share/elasticsearch/config .
基本的配置就能启动
cluster.name: myes
network.host: 0.0.0.0
http.port: 9200
node.name: "es1"
cluster.initial_master_nodes: ["es1"]
#设置一个集群启动时适合做主节点的列表
在各个节点上执行:
sudo sysctl -w vm.max_map_count=262144
(一个进程可以拥有的VMA(虚拟内存区域)的数量)
ElasticSearch集群(2节点)
cluster.name: myes
network.host: 0.0.0.0
http.port: 9200
node.name: "es1"
cluster.initial_master_nodes: ["es1"]
#设置一个集群启动时适合做主节点的列表
增加一些配置 :
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es1", "es2"]
我们再来一个
cluster.name: myes
network.host: 0.0.0.0
http.port: 9200
node.name: "es2"
cluster.initial_master_nodes: ["es1"]
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es1", "es2"]
使用的镜像依然是:docker.elastic.co/elasticsearch/elasticsearch:7.4.2
挂载文件依然是elasticsearch.yml 挂载到/usr/share/elasticsearch/config/elasticsearch.yml
部署Kibana
安装文档:
https://www.elastic.co/guide/en/kibana/current/docker.html我们先在每个节点上执行 docker pull docker.elastic.co/kibana/kibana:7.4.2
这样可以加快点速度
或者
去hub.docker.com 下载 (es也一样)
https://hub.docker.com/r/elastic/kibana/tags
docker pull elastic/kibana:7.4.2
注意,此时镜像名称就是elastic/kibana:7.4.2
当然 你可以自己改掉
查看配置文件
docker run --rm --name testkb -it elastic/kibana:7.4.2 sh
我们发现
kibana的配置 文件在 /usr/share/kibana/config这个目录, 叫做kibana.yml
接下来 我们自己创建
server.port: 5601
server.host: "0.0.0.0"
#ES请求的服务URL
elasticsearch.hosts: ["http://es1:9200","http://es2:9200"]
#无证书
elasticsearch.ssl.verificationMode: none
xpack.security.enabled: false //不使用安全验证
Kibana 身份验证
给Kibana加入Basic Auth身份验证
加入标签
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: kb-auth
文档在此:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#authentication
安装工具
yum -y install httpd-tools
Apache的Web服务器内置的工具,用于创建和更新储存用户名和用户基本认证的密码文件
创建一个密码文件
htpasswd -c auth cyylog
这时产生了一个 auth文件
再添加一个 用户(此时不用-c参数)
htpasswd auth admin
kb.cyylog.cn
创建secret
kubectl -n elk create secret generic kb-auth --from-file=auth
IK中文分词插件
nfsserver
sudo vi /etc/exports
加入一行
/home/cyy/es 192.168.0.0/24(rw,async,insecure,no_root_squash)
(/home/cyy/es 请自行创建,ip请自行修改)
修改后 执行
exportfs -r 或者 systemctl reload nfs-server
确认:
showmount -e 192.168.0.129
ES 的插件路径
我们使用的 es7.4.2 ,默认容器的插件路径在:
/usr/share/elasticsearch/plugins
我们把它挂载到刚才创建的目录中
https://github.com/medcl/elasticsearch-analysis-ik
下载地址:
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.4.2
解压后(文件夹名设置成analysis-ik ,然后通通拷贝到plugins里面)
个人操作:
先拷贝到 tmp目录下,然后 sudo 拷贝过来
cp ~/tmp/analysis-ik . -r
注意:分词器必须和你的ES版本一致,必须、必须、必须
测试下
POST _analyze
{
"analyzer": "ik_smart",
"text" : "程序教程java"
}
创建一个索引试试
PUT news
{
"mappings": {
"properties": {
"news_title": {
"type": "text"
},
"news_kind": {
"type": "keyword"
}
}
}
}
使用SQL查询ES
创建一个索引试试
PUT /books
{
"mappings": {
"properties": {
"BookID": { "type": "integer" },
"BookName": { "type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart","fields":{ "keyword":{"type":"keyword","ignore_above":256}}},
"BookPrice": { "type": "float"},
"BookAuthor": { "type": "keyword"}
}
}
}
批量插入一些数据
POST _bulk
{ "index" : { "_index" : "books", "_id" : "101" } }
{"BookID":101,"BookName":"C语言程序设计","BookPrice":19,"BookAuthor":"老蒋"}
{ "index" : { "_index" : "books", "_id" : "102" } }
{"BookID":102,"BookName":"PHP高级编程","BookPrice":29,"BookAuthor":"老李"}
{ "index" : { "_index" : "books", "_id" : "103" } }
{"BookID":103,"BookName":"java编程从入门到精通","BookPrice":39,"BookAuthor":"老王"}
{ "index" : { "_index" : "books", "_id" : "104" } }
{"BookID":104,"BookName":"无需流汗和吃苦3天成为java大神","BookPrice":15.5,"BookAuthor":"老张"}
SQL访问
文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-getting-started.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-syntax-select.htmlPOST /_sql { "query": "SELECT * FROM books WHERE BookAuthor = '老王'" } 加入?format=txt 参数可以显示 table格式
翻译
POST /_sql/translate
{
"query": "SELECT * FROM books WHERE BookAuthor = '老王'"
}
加入?format=txt 参数可以显示 table格式
match
文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-functions-search.html
"query": "SELECT BookName,BookID FROM books WHERE match(BookName,'我从小就喜欢编程') "
"query": "SELECT BookName,BookID FROM books WHERE match('BookName','我从小就喜欢java编程') order by SCORE() desc "
实操示范
配置负载均衡、Go调用
首先安装客户端库
go get github.com/olivere/elastic/v7
func getClient() *elastic.Client {
client, err := elastic.NewSimpleClient(
elastic.SetSniff(false),
elastic.SetURL("http://es.jtthink.com/es1/","http://es.jtthink.com/es2/" ),
)
if err != nil {
panic(err)
}
return client
}
辅助函数
type Books struct{
BookID int
BookName string
BookPrice1 float64
BookAuthor string
}
func MapToBooks(rsp *elastic.SearchResult) []*Books {
ret:=[]*Books{}
var t *Books
for _,item:=range rsp.Each(reflect.TypeOf(t)){
ret=append(ret,item.(*Books))
}
return ret
}
具体代码
matchQuery:=elastic.NewMatchQuery("BookName","编程")
ret,err:=getClient().Search().Index("books").Query(matchQuery).Do(context.Background())
if err!=nil{
log.Fatal(err)
}
books:=MapToBooks(ret)
翻译
POST /_sql/translate
{
"query": "SELECT * FROM books WHERE BookAuthor = '老王'"
}
加入?format=txt 参数可以显示 table格式
match
文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-functions-search.html
"query": "SELECT BookName,BookID FROM books WHERE match(BookName,'我从小就喜欢编程') "
"query": "SELECT BookName,BookID FROM books WHERE match('BookName','我从小就喜欢java编程') order by SCORE() desc "